我有两个表,第一个表包含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中为上面的表结构设置一对一映射呢?
答案 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;
}