2016-11-24 60 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提供一个单独的主键 –