合并后 Hibernate 不初始化多对一关系
Hibernate does not initialize many-to-one relation after merge
我有以下 class:
public class Entry{
private long cardNumber;
private long companyId;
private Company company;
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public long getCardNumber() {
return mediaSerialNumberId;
}
public void setCardNumber(long number) {
this.cardNumber = number;
}
public long getCompanyId() {
return companyId;
}
public void setCompanyId(long id) {
this.companyId = id;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
使用以下到公司的单向映射:
<hibernate-mapping>
<class name="foo.bar.Entry" table="RECONSTRUCTION" polymorphism="implicit" lazy="false">
<id name="id" column="ID" type="long" unsaved-value="null">
<generator class="sequence">
<param name="sequence">SEQ_ENTRY</param>
</generator>
</id>
<property name="cardNumber" column="CARDNUMBER" type="long"/>
<property name="companyId" column="COMPANYID" type="long"/>
<many-to-one name="company" column="COMPANYID" class="foo.bar.Company" insert="false" update="false" />
</class>
</hibernate-mapping>
我创建了一个新条目,设置 CardNumber=123,CompanyId=3 并使用 session.merge() 保存它。 ID=3 的公司存在,我可以用 session.load() 加载它。
公司与 Entry 没有任何 Hibernate 关系。
返回的持久条目具有 getCompanyId()==3 但 getCompany()==null。
为什么 Hibernate 没有在新持久化的对象中初始化多对一关系?
如果我切换 "companyId" 属性为 insert/update=false,我可以设置一个现有的公司对象,但是 getCompanyId()==null 而不是公司的 ID。
在数据库中正确保存了 COMPANYID 列。
我正在使用 Hibernate 3.6.10。
您需要refresh
实体:
Entry entry = new Entry();
entry.setCardNumber(123);
entry.setCompanyId(3);
entry = session.merge(entry);
session.flush();
session.refresh(entry );
因为合并将给定的实体状态复制到从数据库中获取的实体状态,所以空的多对一关联也将复制到从数据库中获取的实体状态。一个refresh
应该可以解决。
更好的方法是简单地使用多对一关联而不使用额外的 companyId
列:
<many-to-one name="company" column="COMPANYID" class="foo.bar.Company"/>
这样,您甚至可以设置公司而无需从数据库中获取:
Entry entry = new Entry();
entry.setCardNumber(123);
entry.setCompany(new Company());
entry.getCompany().setId(3);
session.persist(session);
我有以下 class:
public class Entry{
private long cardNumber;
private long companyId;
private Company company;
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public long getCardNumber() {
return mediaSerialNumberId;
}
public void setCardNumber(long number) {
this.cardNumber = number;
}
public long getCompanyId() {
return companyId;
}
public void setCompanyId(long id) {
this.companyId = id;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
}
使用以下到公司的单向映射:
<hibernate-mapping>
<class name="foo.bar.Entry" table="RECONSTRUCTION" polymorphism="implicit" lazy="false">
<id name="id" column="ID" type="long" unsaved-value="null">
<generator class="sequence">
<param name="sequence">SEQ_ENTRY</param>
</generator>
</id>
<property name="cardNumber" column="CARDNUMBER" type="long"/>
<property name="companyId" column="COMPANYID" type="long"/>
<many-to-one name="company" column="COMPANYID" class="foo.bar.Company" insert="false" update="false" />
</class>
</hibernate-mapping>
我创建了一个新条目,设置 CardNumber=123,CompanyId=3 并使用 session.merge() 保存它。 ID=3 的公司存在,我可以用 session.load() 加载它。 公司与 Entry 没有任何 Hibernate 关系。
返回的持久条目具有 getCompanyId()==3 但 getCompany()==null。
为什么 Hibernate 没有在新持久化的对象中初始化多对一关系? 如果我切换 "companyId" 属性为 insert/update=false,我可以设置一个现有的公司对象,但是 getCompanyId()==null 而不是公司的 ID。
在数据库中正确保存了 COMPANYID 列。
我正在使用 Hibernate 3.6.10。
您需要refresh
实体:
Entry entry = new Entry();
entry.setCardNumber(123);
entry.setCompanyId(3);
entry = session.merge(entry);
session.flush();
session.refresh(entry );
因为合并将给定的实体状态复制到从数据库中获取的实体状态,所以空的多对一关联也将复制到从数据库中获取的实体状态。一个refresh
应该可以解决。
更好的方法是简单地使用多对一关联而不使用额外的 companyId
列:
<many-to-one name="company" column="COMPANYID" class="foo.bar.Company"/>
这样,您甚至可以设置公司而无需从数据库中获取:
Entry entry = new Entry();
entry.setCardNumber(123);
entry.setCompany(new Company());
entry.getCompany().setId(3);
session.persist(session);