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回の反復を実行します。
- 私はジャンル(34個のオブジェクト)のリストを保持します。私のデータベーステーブルをチェックすると、34のジャンルすべてを取得できます。
- 私はムービーリスト(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();
}
}
なぜOneToMany結合テーブルがありますか?それはManyToManyではありませんか? –
あなたは正しいです、それはManyToManyでなければなりません。あなたのコメントをアップしてください。 – CrazySabbath