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 表中,首先复制,然后插入新条目。两次连续方法调用后我的数据库表如下所示:

add('DS', '飞丽', 'TA');

-    DS     Feili      TA


添加('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

尝试使 TeachingExperience 类成为一个完整的实体,其中包含一个@Id字段以及@ManyToOne与 CV 实体的关系。在这种情况下使用@Embeddable似乎不合适。

于 2013-03-31T20:35:46.717 回答
0

要修复此错误,您应该使用update()method 而不是merge(). update()将提供您撤消已删除的项目。因此,如果您使用update(),则插入期间的问题将得到修复,并且如果您从列表中删除某些内容,它将从列表中删除!但是您可以在数据库中看到已删除的实体。如果你想从数据库中删除所有的东西,你应该使用merge()删除和update()插入。有时也定期刷新数据库可以帮助您解决这个问题。

于 2013-04-09T14:55:28.823 回答