2013-03-31 144 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()進行插入。定期沖洗數據庫有時會幫助你解決這個問題。