2017-05-30 197 views
0

我在將實體保存到數據庫時遇到了問題。休眠JPA joinTable共享ID

@MappedSuperclass 
public abstract class BaseJpa { 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private Integer id; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 
} 

@Entity 
@Table(name="genres") 
public class GenreJpa extends BaseJpa{ 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

@Entity 
@Table(name="movies") 
public class MovieJpa extends BaseJpa{ 

    @Type(type="text") 
    private String name; 

    private String releaseDate; 

    @Type(type="text") 
    private String summary; 

    @JoinTable(name = "movie_genres", joinColumns = @JoinColumn(name = "movie_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "genre_id", referencedColumnName = "id")) 
    @OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY) 
    private List<GenreJpa> genres; 

    private long votes; 

    private double rank; 

    public long getVotes() { 
     return votes; 
    } 

    public void setVotes(long votes) { 
     this.votes = votes; 
    } 

    public double getRank() { 
     return rank; 
    } 

    public void setRank(double rank) { 
     this.rank = rank; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getReleaseDate() { 
     return releaseDate; 
    } 

    public void setReleaseDate(String releaseDate) { 
     this.releaseDate = releaseDate; 
    } 

    public String getSummary() { 
     return summary; 
    } 

    public void setSummary(String summary) { 
     this.summary = summary; 
    } 

    public List<GenreJpa> getGenres() { 
     return genres; 
    } 

    public void setGenres(List<GenreJpa> genres) { 
     this.genres = genres; 
    } 

說完這些實體,我做2次迭代:

  1. 我堅持流派的列表(34級的對象)。檢查我的數據庫表,我可以獲取所有34種流派。
  2. 我堅持一個電影列表(超過1密爾對象)。現在,每個電影對象都有一個流派列表,並且這些流派正被插入到具有不同ID的流派表格中。是不可能讓它分享已經插入的流派?爲了不再插入流派?

方法用來插入數據:

public void batchInsertMovies(List<MovieJpa> movies){ 
    EntityManager entityManager = EMF.get().createEntityManager(); 
    try{ 
     entityManager.getTransaction().begin(); 
     int i = 0; 
     for(MovieJpa movie : movies){ 
      entityManager.persist(movie); 
      i++; 
      if(i == 30){ 
       //flush a batch of inserts and release memory 
       entityManager.flush(); 
       entityManager.clear(); 
      } 
     } 
     entityManager.getTransaction().commit(); 
    } catch (Exception e){ 
     e.printStackTrace(); 
     entityManager.getTransaction().rollback(); 
    } finally { 
     entityManager.close(); 
    } 
} 

public void batchInsertGenres(List<GenreJpa> genres){ 
    EntityManager entityManager = EMF.get().createEntityManager(); 
    try{ 
     entityManager.getTransaction().begin(); 
     int i = 0; 
     for(GenreJpa genre : genres){ 
      entityManager.persist(genre); 
      i++; 
      if(i == 5){ 
       //flush a batch of inserts and release memory 
       entityManager.flush(); 
       entityManager.clear(); 
      } 
     } 
     entityManager.getTransaction().commit(); 
    } catch (Exception e){ 
     e.printStackTrace(); 
     entityManager.getTransaction().rollback(); 
    } finally { 
     entityManager.close(); 
    } 
} 
+2

爲什麼你有OneToMany連接表?它不應該是ManyToMany嗎? –

+0

你是對的,應該是ManyToMany。 Upvoting您的評論。 – CrazySabbath

回答

0
entityManager.persist(movie); 

影片包含流派。這個集合中的每個Genre實例都應該填充id字段,否則Hibernate會認爲它是一個新對象,並且如果級聯選項合適,它將嘗試持久化它。

+0

設置ID手動解決了我的問題。 – CrazySabbath