【问题标题】:Hibernate does not initialize many-to-one relation after mergeHibernate 在合并后不初始化多对一关系
【发布时间】:2015-03-10 01:42:00
【问题描述】:

我有以下课程:

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 关系。

返回的持久化 Entry 有 getCompanyId()==3 但 getCompany()==null。

为什么 Hibernate 没有在新持久化的对象中初始化多对一关系? 如果我切换到“companyId”属性为 insert/update=false,我可以设置一个现有的 Company 对象,但然后 getCompanyId()==null 代替 Company 的 ID。

在数据库中,COMPANYID 列已正确保存。

我使用的是 Hibernate 3.6.10。

【问题讨论】:

  • 谢谢,请问是关系还是班级?
  • 我对此进行了测试,但没有效果。您能否详细说明为什么您认为这可能是解决方案?
  • 你试过吗?
  • fetch 不是类的合法属性。我在关系上试过了,但没有效果。

标签: java hibernate merge hibernate-mapping many-to-one


【解决方案1】:

你需要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"/>

这样,您甚至可以设置公司,而无需从 DB 中获取:

Entry entry = new Entry();
entry.setCardNumber(123);

entry.setCompany(new Company());
entry.getCompany().setId(3);
session.persist(session);

【讨论】:

  • 我可以确认 refresh() 成功了。我之前尝试过使用 load() ,但我相信这只是到了已经缓存的对象。无论如何,鉴于这个“陷阱”,我将按照您的建议在未来避免重复映射。谢谢!
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2016-05-14
相关资源
最近更新 更多