埋め込みクラス
@Embeddable
public class TeachingExperience {
private String courseName;
private String instructor;
private String description;
}
エンティティ 1
@Entity
public class CV {
@ElementCollection(fetch= FetchType.EAGER)
@Fetch(value = FetchMode.SELECT)
private List<TeachingExperience> teachingExperiences;
}
エンティティ 2
@Entity
public class Student {
@OneToOne(cascade= CascadeType.ALL, orphanRemoval=true)
private CV cv;
}
CV クラスには、個人の教育経験のリストが格納されます。熱心にフェッチする必要があるフィールドが他にもあるため、@Fetch アノテーションを使用します。
この方法を使用して、特定の学生の履歴書に新しい教育経験を追加します。
public static void add (String course, String prof, String desc) {
TeachingExperience TE = new TeachingExperience(course, prof, desc);
student.getCv().getTeachingExperiences().add(TE);
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
session.merge(student);
session.getTransaction().commit();
session.close();
}
この構成では、新しい教育経験を追加しようとするたびに、DB テーブルに保存されたデータが最初に複製され、次に新しいエントリが挿入されます。2 回連続してメソッドを呼び出した後のデータベース テーブルは次のようになります。
add('DS', 'Feili', 'TA');
- DS Feili TA
add('AP', 'Ramtin', 'TA');
- DS Feili TA
- DS Feili TA
- AP Ramtin TA
教育経験のリストからオブジェクトを削除しようとすると、同じ問題が発生し、コードのどの部分がこの奇妙な動作の原因なのかわかりません。
あなたの助けは非常に高く評価されます。
編集1:
@Entity
public class TeachingExperience {
@Id @GeneratedValue
private Integer id;
private String courseName;
private String instructor;
private String description;
}
@Entity
public class CV {
@OneToMany(fetch= FetchType.EAGER, cascade=CascadeType.ALL, orphanRemoval=true)
@Fetch(value = FetchMode.SELECT)
@JoinColumn(name="cv")
private List<TeachingExperience> teachingExperiences;
}