2013-03-31 89 views
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(); 
} 

,每次我尝试添加一个新的教学经历这种配置,存储在数据库表中的数据,先被复制,然后插入新条目。我的数据库表在两次连续的方法调用后看起来像这样:

add('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

我认为你应该将'TeachingExperience'设置为'Entity',并尝试'update()'而不是'merge()'。请让我知道这些更改后会发生什么! – boomz

+0

@boomz,谢谢你的回复。我已经将TeachingExperience改为实体(编辑1)。 有趣的是,在将merge()更改为update()之后,我的原始问题已解决,但又出现了另一个问题;从教学体验列表中删除项目不会传播到数据库表。 – mdoust

回答

0

尝试使TeachingExperience类的@Id领域的完全成熟的实体和@ManyToOne关系到CV实体。在这种情况下,使用@Embeddable似乎不合适。

+0

我按照您的建议更改了我的映射,但问题仍然相同...我的新映射在编辑1下可用。 – mdoust

+0

也尝试将集合设置为Set而不是List,并让TeachingExperience类实现hashCode()并等于() 方法。 –

0

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