2012-06-08 75 views
0

第一次我在項目中使用persist()方法。使用JPA,我使用Hibernate作爲提供者。案件非常簡單。我有2個表使用JPA的persist()方法的瞬態異常..對實體持久性的懷疑..持續哪一方面?

  1. 公司 - COMPANY_ID(PK,序列),G_Company_id(也將是唯一的)
  2. CP_Doc - Chronicle_id(PK),COMPANY_ID(FK上述COMPANY_ID))

現在我有一些特定公司的CP_Docs。我已成功創建實體(爲createNativeQuery,JPA的createQuery工作)。我還提到了集合的cascade = CASCADE.ALL。

For persisting我寫下面的代碼。

Company company = new Company(); 
    company.setGCompanyId(7); 
    for(/* Get all docs for a particular company having id = 7 */) { 
     CP_Doc cpDoc = new CP_Doc(); 
     cpDoc.setChronicleId(/* some chronicle id from the loop */);  
     cpDoc.setCompany(company); 
     entityManager.persist(cpDoc); 
    } 

表格之間的關係是一家公司可以有許多cp_docs。所以CP_Doc表是所有者表。我嘗試從CP_Doc一側繼續。我能否堅持公司實體一方?請幫助專家:)

回答

1

如果我理解正確,您已經擁有數據庫中的一家公司,ID爲7,並且您嘗試向該公司添加CPDoc。

在這種情況下,堅持公司是沒有意義的,因爲它已經存在。而且創建一家新公司也是沒有意義的,因爲它已經存在。而應該從數據庫中加載的公司,該公司重視新CPDocs(反之亦然):

Company company = entityManager.find(Company.class, 7); 
for(...) { 
    CP_Doc cpDoc = new CP_Doc(); 
    cpDoc.setChronicleId(...);  
    cpDoc.setCompany(company); 
    company.getCPDocs().add(cpDoc); 
    entityManager.persist(cpDoc); 
} 
+0

嗨@Nizet,有輕微的錯誤,我在這部分「company.setGCompanyId糾正(7) ;」 可能有2種情況 - 1)G_Company_ID已經存在(例如在這種情況下7存在)。這裏是「company.getCPDocs()。add(cpDoc);」必要?我認爲它會隱式發生,因爲我們在此代碼中添加公司cpDoc「cpDoc.setCompany(company);」 2)當G_Company_id不在數據庫中 - 在這裏我們必須做一個新的公司()像我的問題中的代碼? (在find()失敗後) – abhihello123

+1

1.這不是絕對必要的,但是如果你想要一個一致的對象圖,你必須自己維護它。例如,如果您繼續在同一個會話中使用該公司,並且希望在其集合中找到新的CPDoc,則它不會在該集合中。只有當您在新會話中從數據庫中重新加載公司時,它纔會在那裏。是的,如果公司不存在,則需要創建它並堅持它。 –

+0

+1在答案中的明確解釋以及評論:) – abhihello123