簡體   English   中英

合並后,Hibernate不會初始化多對一關系

[英]Hibernate does not initialize many-to-one relation after merge

我有以下課程:

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()加載它。 公司沒有任何與休眠有關的回溯關系。

返回的持久條目具有getCompanyId()== 3,但getCompany()== null。

為什么Hibernate不在新持久化的對象中初始化多對一關系? 如果切換為使“ companyId”屬性為insert / update = false,則可以設置現有的Company對象,但是可以設置getCompanyId()== null而不是Company的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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM