2017-05-30 13 views
0

エンティティをデータベースに保存する際に問題があります。これらのエンティティを持つHibernate 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でなければなりません。あなたのコメントをアップしてください。 – CrazySabbath

答えて

0
entityManager.persist(movie); 

映画のジャンルが含まれています。このコレクションの各Genreインスタンスにはidフィールドが設定されていなければなりません。そうでない場合、Hibernateはそれを新しいオブジェクトとみなし、カスケードオプションが適切であればそれを保持しようとします。

+0

設定IDが手動で問題を解決しました。 – CrazySabbath

関連する問題