嵌入式课程
@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;
}
答案 0 :(得分:0)
尝试使TeachingExperience类成为一个完整的实体,其中@Id
字段与CV实体的@ManyToOne
关系。在这种情况下,使用@Embeddable
似乎不合适。
答案 1 :(得分:0)
要修复此错误,您应该使用update()
方法而不是merge()
。 update()
将为您提供撤消已删除邮件的权限。因此,如果您使用update()
,则会解决插入过程中出现的问题,如果您从列表中删除某些内容,则会从中删除!但是您可以在数据库中看到已删除的实体。如果要从数据库中删除所有内容,则应使用merge()
删除并使用update()
进行插入。有时也会定期刷新数据库,这有助于解决这个问题。