2016-11-25 62 views
2

我有兩個表,第一個表包含company_id,company_name和國家名稱,第二個表包含與一對一映射的公司相關的細節。休眠一對一映射不用父類獲取子類數據

這是我的表結構: -

company { 
     company_id int, 
     company_name varchar, 
     country varchar 
    } 

    company_detail { 
     id int, 
     company_id int, 
     company_description text, 
     future_goal text 
    } 

繼POJO用來映射: -

在公司POJO: -

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name="COMPANY_ID") 
private CompanyDetails companyDetails; 

在CompanyDetail POJO: -

@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL) 
@JoinColumn(name="COMPANY_ID") 
public Company company; 

但是當我得到公司對象時,它在companyDetails中包含null。用於獲取Company對象

下面的代碼: -

Company company = (Company) session.get(Company.class, companyId); 

我想與公司數據得到companyDetails數據一起。

我做錯了什麼? 解決此問題需要更改哪些代碼。

+0

你的領域是一個私有類CompanyCaptiveDetails'的'但是你的POJO被命名爲'CompanyDetail' 。請解釋 – henrik

+0

對不起,我糾正了我的問題。現在請看 –

+0

閱讀有關雙向關聯的hibernate文檔。一方(沒有外鍵的一方)必須是另一方的反面,使用mappedBy。在您的映射中,您可以定義兩個單獨的一對一關聯。並且您告訴company.company_id是company_detail.id的連接列(即外鍵),這不正確。我真的不明白這兩張表的重點。你可以把所有東西放在公司的表格中。 –

回答

3

使用雙向@OneToOne關係(讀more info它):

// in Company POJO: 
@OneToOne(mappedBy="company", cascade=CascadeType.ALL, fetch = FetchType.EAGER) 
private CompanyDetails companyDetails 

// in CompanyDetails POJO: 
@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL) 
@JoinColumn(name="company_id") 
public Company company; 

然後取了company對象之後,你可以得到它的詳細信息(如Company已經CompanyDetails日):

Company company = (Company) session.get(Company.class, companyId); 
CompanyDetails details = company.getCompanyDetails(); 
+0

非常感謝。 –

2

在這兩個的POJO您有:

@JoinColumn(name="COMPANY_ID") 

你應該改變這

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "company") 
private CompanyDetails companyDetails; 

@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL) 
@JoinColumn(name="COMPANY_ID") 
public Company company; 
+0

非常感謝。 –