2016-11-24 64 views
2

我有兩個表,第一個表包含company_id,company_name和國家名稱,第二個表包含與一對一映射公司相關的細節。休眠一對一映射與子類複合列

我想用Hibernate來執行以下操作映射: -

 company { 
      company_id int, 
      company_name varchar, 
      country varchar 
     } 

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

公司COMPANY_ID表應當與company_detail表,所以我已按照POJO

 In Company POJO :- 
     @OneToOne(cascade=CascadeType.ALL) 
     @JoinColumn(name="COMPANY_ID") 
     private CompanyDetails companyDetails; 

     In CompanyDetails POJO :- 
     @Column(name="COMPANY_ID", nullable=false) 
     public Company company; 

也映射COMPANY_ID地圖, setter中添加以下代碼: -

public void setCompanyDetails(CompanyDetails companyDetails) { 
     companyDetails.setCompany(this); 
     this.companyDetails = companyDetails; 
    } 

此代碼工作fin e,保存公司時只有一個問題,null存儲在company_detal的company_id中,而不是公司表中創建的公司id。所有其他細節正確存儲。 那麼如何在POJO中爲上面的表結構設置一對一的映射呢?

回答

1

編輯:如果你想生成CompanyDetail單獨的主鍵

,那麼它是如下

@Id 
@GeneratedValue 
@Column(name="COMPANY_DETAIL_ID", unique = true, nullable = false) 
public int companyDetailId; 

@OneToOne 
@PrimaryKeyJoinColumn(name="COMPANY_ID") 
public Company company; 

簡單######### ################################################## ###########

請參閱此鏈接hibernate-jpa-onetoone-association-by-common-primary-ke

您必須在companyDetail東西使用共享主鍵生成類似下面

@Id 
@GeneratedValue(generator="SharedPrimaryKeyGenerator") 
@GenericGenerator(name="SharedPrimaryKeyGenerator",strategy="foreign",parameters = @Parameter(name="property", value="company")) 
@Column(name="COMPANY_ID", unique = true, nullable = false) 
public int companyId; 

@OneToOne 
@PrimaryKeyJoinColumn 
public Company company; 

而且在你公司

@OneToOne(cascade=CascadeType.ALL) 
    @PrimaryKeyJoinColumn(referencedColumnName="Company_ID") 
    public CompanyDetail companyDetail 

另外,還要確保你設定的公司價值CompanyDetail和companyDetail值公司如下,

In Company

public void setCompanyDetail(CompanyDetail companyDetail){ 
    companyDetail.setCompany(this); 
    this.companyDetail = companyDetail; 
} 

同樣在CompanyDetail

public void setCompany(Company company){ 
    company.setCompanyDetail(this); 
    this.company = company; 
} 
+0

我也想在公司詳細信息表自動生成的行ID。 在這種情況下需要做什麼改變? –

+0

您的意思是你要爲CompanyDetail生成單獨的主鍵 – Sagar

+0

是的,薩加爾。我想爲CompanyDetail提供一個單獨的主鍵 –