2015-01-12 3 views
1

я следующий класс:Hibernate не инициализирует многие-к-одному отношений после слияния

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> 

создать новый Entry, set CardNumber = 123, CompanyId = 3 и сохранить его с помощью session.merge(). Компания с ID = 3 существует, я могу загрузить ее с session.load(). Компания не имеет отношения Hibernate к Entry.

Возвращенная сохраняемая запись имеет getCompanyId() == 3, но getCompany() == null.

Почему нет отношения «много-к-одному», инициализированного Hibernate в недавно сохраненном объекте? Если я переключусь так, чтобы атрибут «companyId» был вставлен/обновлен = false, я могу вместо этого установить существующий объект Company, но вместо этого getCompanyId() == null вместо ID компании.

В базе данных колонка COMPANYID правильно сохраняется.

Я использую Hibernate 3.6.10.

+0

сделать lazy = "true" –

+0

Спасибо, будет ли это на отношение или класс? –

+0

<класс ... lazy = "true"> –

ответ

1

Вы должны refresh сущности:

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

session.flush(); 
session.refresh(entry); 

Поскольку слияния копий данного лицо состояние за один извлеченный из базы данных, нулевые многие к одному ассоциации также будет перекопируется один неправдоподобный из базы данных. A 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); 
+0

Я могу подтвердить, что refresh() сделал трюк. Раньше я пытался с load(), но я считаю, что только что дошел до уже кэшированного объекта. В любом случае, учитывая эту «гочу», я буду избегать дубликальных сопоставлений в будущем, как вы предлагаете. Благодаря! –