Hibernate无法更新数据库中的元素集合

时间:2013-03-31 16:52:27

标签: hibernate java-ee

嵌入式课程

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


简历类存储一个人的教学经验列表。还有其他字段应该热切地提取,因此@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();
}

使用此配置每次我尝试添加新的教学体验,存储在数据库表中的数据,首先获得重复,然后插入新条目。连续两次方法调用后我的数据库表如下所示:

添加('DS','Feili','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;
}


2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

要修复此错误,您应该使用update()方法而不是merge()update()将为您提供撤消已删除邮件的权限。因此,如果您使用update(),则会解决插入过程中出现的问题,如果您从列表中删除某些内容,则会从中删除!但是您可以在数据库中看到已删除的实体。如果要从数据库中删除所有内容,则应使用merge()删除并使用update()进行插入。有时也会定期刷新数据库,这有助于解决这个问题。