2014-10-01 79 views
0

我有兩個域類。以下是課程的粗略草圖。無法獲取CascadeTypes的用法

Company.java

public class Company{ 

    @OneToMany(orphanRemoval="true",cascade=CascadeType.ALL, 
    mappedBy="company") 
    private List<Department> departments; 

} 

Department.java

public class Department{ 

    @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST) 
    @JoinColumn(name="company_id") 
    private Company company 

} 

JPA @ManyToOne with CascadeType.ALL說CascadeType.ALL的含義是,將持續傳播(級聯)所有的EntityManager操作(PERSIST, REMOVE, REFRESH, MERGE, DETACH)到相關實體。

Test.java的主要方法

//session started and transaction begin 
Company company=new Company(); 
company.setName("Company"); 

Department department=new Department(); 
department.setName("Testing department"); 

department.setCompany(company); 

session.save(department); 

//transaction committed and session closed 

它給我的異常

Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: someValue 

但是,當我在@ManyToOne批註使用CascadeType.ALL,它工作正常,但不能與CascadeType.PERSIST 那麼什麼我是否應該使用這個示例,而不使用CascadeType.ALL,因爲所有用戶都使用(PERSIST, REMOVE, REFRESH, MERGE, DETACH)。那麼下面我應該用哪些來完成我的工作而不是所有工作?

回答

1

您已將CascadeType設置爲PERSIST,因此您必須使用session.persist(Object)方法而不是save

所以用這個:

session.persist(department); 

更新:

Company實體的CascadeType設置爲ALLDepartment。同樣在一對多關係中,許多方面是Department是協會的所有者。

所以,如果您保存Company而不是DepartmentCascadeType.ALL是適用的。由於公司不是該協會的所有者,您必須將該部門添加到您的Company以維持雙向關係。代碼看起來像這樣。

List<Department> departments = new ArrayList<Department>(); 
    departments.add(department); 
    company.setDepartments(departments); 

    session.persist(company); // or you can also use save here. 

如果不保持關係,然後Department將不會被保存在數據庫中。

+0

所以我的問題是如何CASCADE.ALL作品,未經堅持用方法? – 2014-10-01 12:42:28

+0

請儘量給予適當的解釋,以便我可以將此答案標記爲已接受。 – 2014-10-01 12:47:00

+0

看到我的答案,現在更新了。 – Chaitanya 2014-10-01 12:48:48

1

看起來您正在將JPA註釋與Hibernate會話接口混合在一起。

如果您使用的是Hibernate Session接口,您應該使用Hibernate註釋。那就是:

@Cascade(CascadeType.SAVE_OR_UPDATE) 
    private Company company 

如果您選擇使用JPA註解,你應該使用EntityManager接口,並調用

entityManager.persist(departement); 

代替session.save的()。

我的建議是堅持使用JPA接口並使用EntityManager。

UPDATE:

我認爲真正的問題是,你想堅持(或保存)一個獨立的實體,在DEPARTEMENT,那是另一獨立的實體,本公司,在一一對多的關係。發生時,Hibernate必須通過合併(附加)公司實體來檢查公司是否已經存在於數據庫中。 所以,如果你想在DB來插入DEPARTEMENT一個新的記錄,另一個用於公司你必須或者:保存DEPARTEMENT前

  • 通話堅持(公司),使本公司實體已經合併和Hibernate不需要合併它。

或添加CascadeType.MERGE到公司

@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST }) 
private Company company 
+0

所以我的問題是如何CASCADE.ALL沒有使用堅持辦法工作? – 2014-10-01 12:43:27

+0

我已更新答案 – Giovanni 2014-10-01 13:18:08

+0

你可以看到我的實際問題是什麼。 ALL意味着所有操作,不像任何單一操作,意味着不是上述類型之一。 。我的問題中的鏈接告訴同樣的事情 - > CascadeType.ALL的含義是持久性將傳播(級聯)所有EntityManager操作(PERSIST,REMOVE,REFRESH,MERGE,DETACH)到相關實體。 – 2014-10-01 13:25:00