使用子类复合列进行Hibernate一对一映射

时间:2016-11-24 08:03:01

标签: java hibernate spring-mvc jpa

我有两个表,第一个表包含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表的company_id,所以我在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;

另外,在setter中添加以下代码: -

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

此代码工作正常,保存公司时只出现一个问题,null存储在company_detal的company_id中,而不是在公司表中创建的公司ID。所有其他细节存储正确。 那么如何在POJO中为上面的表结构设置一对一映射呢?

1 个答案:

答案 0 :(得分: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

您必须在公司详细信息中使用共享主键生成器,如下所示

 @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值,如下所示

在公司

public void setCompanyDetail(CompanyDetail companyDetail){
   companyDetail.setCompany(this);
   this.companyDetail = companyDetail;
}
同样在CompanyDetail中

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