Java 合并后Hibernate不会初始化多对一关系

Java 合并后Hibernate不会初始化多对一关系,java,hibernate,merge,hibernate-mapping,many-to-one,Java,Hibernate,Merge,Hibernate Mapping,Many To One,我有以下课程: 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 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()加载它。 公司没有任何Hibernate关系返回条目

返回的持久化条目的getCompanyId()==3,但getCompany()==null。

为什么Hibernate没有在新持久化的对象中初始化多对一关系? 如果我切换“companyId”属性为insert/update=false,我可以改为设置一个现有的公司对象,但是getCompanyId()==null而不是公司的ID

在数据库中正确保存COMPANYID列


我正在使用Hibernate 3.6.10。

您需要
刷新实体:

Entry entry = new Entry();
entry.setCardNumber(123);
entry.setCompanyId(3);
entry = session.merge(entry);   

session.flush();
session.refresh(entry );
因为合并会将给定实体状态复制到从数据库获取的实体状态上,所以空的多对一关联也会复制到从数据库获取的实体状态上。
刷新
应该可以解决这个问题

更好的方法是只使用多对一关联,而不使用额外的
companyId
列:

<many-to-one name="company" column="COMPANYID" class="foo.bar.Company"/>

谢谢,这是关系还是班级的问题?我测试了这个,但没有效果。你能解释一下为什么你认为这可能是解决方案吗?你试过了吗?fetch不是类的合法属性。我在关系上试过了,但没有效果。我可以确认refresh()成功了。我以前尝试过load(),但我相信它只是到达了已经缓存的对象。无论如何,考虑到这一点,我将按照您的建议在将来避免重复映射。谢谢
Entry entry = new Entry();
entry.setCardNumber(123);

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