1

埋め込みクラス

@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;
}


4

2 に答える 2

0

このバグを修正するにはupdate()、 の代わりに メソッドを使用する必要がありmerge()ます。update()削除されたアイテムを元に戻すことができます。したがって、を使用するupdate()と、挿入中の問題が修正され、リストから何かを削除すると、リストから削除されます! ただし、削除されたエンティティはデータベースで確認できます。データベースからすべてのものを削除したい場合はmerge()、削除に使用update()し、挿入に使用する必要があります。また、時々データベースを定期的にフラッシュすると、この問題を解決するのに役立ちます。

于 2013-04-09T14:55:28.823 に答える