2013-08-20 132 views
9

我使用的是Hibernate 3.3.1,我想創建個人與分配公司之間的關係。他們應該鬆散耦合,但我想安排 通過級聯創建公司,而不是明確調用saveOrUpdate(newCompany)。Hibernate @ManyToOne僅適用於CascadeType.ALL

我定義了以下實體:

class Company 
{ 
    @Id 
    Long companyId; 
    String name; 
} 

class Person 
{ 
    @Id 
    Long personId; 
    String name; 
    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE}) 
    Company company; 
} 

吾道里面我做了以下內容:

testpers.setCompany (newCompany); 
session.saveOrUpdate(testpers); 

,我得到一個異常

org.hibernate.TransientObjectException:對象引用未保存的 瞬態實例 - 在刷新之前保存瞬態實例: consearch.model.core.Company

當註釋「級聯= CascadeType.ALL」它的工作原理,但我不希望也 ccade缺失(例如如果一個公司被刪除,那麼這個人不應該被刪除)

我想知道沒有人之前有這個問題 在此先感謝幫助我。 Shane

回答

10

當使用非JPA Session.saveOrUpdate()方法時,可能需要啓用Hibernate自定義@Cascade
添加@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)或使用Session.persist()

+0

這正是正確的答案,加入@Cascade註釋後,它按預期工作!非常感謝! – Shannon

+0

歡迎來到SO。如果下面的答案之一解決了您的問題,您應該接受它(點擊相應答案旁邊的複選標記)。這有兩件事。它可以讓每個人都知道你的問題已經得到解決,並且可以幫助你獲得幫助。請參閱[此處](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235)以獲取完整說明 –

+0

@bellabax您是如何通過此解決方案來的?它在hibernate文檔中有描述嗎?你能否指出一個參考,詳細描述這個問題,特別是爲什麼會發生這種情況?我發現這個http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/,但它不是非常東方的理解,而不考慮休眠源。 – jhegedus

-1

我不覺得映射是正確的

class Company 
{ 
@Id 
Long companyId; 
String name; 
@OneToMany(fetch = FetchType.LAZY,mappedBy="company" 
@Cascade({CascadeType.SAVE_UPDATE}) 
List<Person> persons; 
} 

class Person 
{ 
@Id 
Long personId; 
String name; 
@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name="company_id") 
Company company; 
} 

集現在這個樣子

Company c=new Company(); 
List<Person> plist=new ArrayList<>(); 
Person p=new Person(); 
p.setCompany(c); 
plist.add(p); 
c.setPersons(plist); 
dao.save(c);