2017-05-30 195 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