2015-01-12 9 views
1

나는 다음과 같은 클래스가 병합 대일 관계를 초기화하지 않습니다 항목, CardNumber = 123, CompanyId = 3을 설정하고 session.merge()로 저장하십시오. ID가 3 인 회사가 존재하며 session.load()로로드 할 수 있습니다. 회사는 항목에 대한 최대 절전 모드 - 관계가 없습니다.최대 절전 모드 후

반환 된 지속 된 항목에는 getCompanyId() == 3이지만 getCompany() == null이 있습니다.

왜 새로 생성 된 객체에서 Hibernate에 의해 many-to-one 관계가 초기화되지 않는가? "companyId"특성이 insert/update = false가되도록 전환하면 기존 Company 개체를 대신 설정할 수 있지만 Company의 ID 대신 getCompanyId() == null을 설정할 수 있습니다.

데이터베이스에서 COMPANYID 열이 올바르게 저장됩니다.

나는 최대 절전 모드 3.6.10을 사용하고있다. 데이터베이스에서 가져온 개 이상의 지정된 엔티티 상태, 널 많은-to-one 연관은 또한 하나 가져온 복사됩니다 병합 사본 때문에

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

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

:

+0

make lazy = "true" –

+0

감사합니다. 관계 또는 클래스에 있습니까? –

+0

답변

1

당신은 엔티티를 refresh 필요 데이터베이스에서. refresh으로 해결해야합니다. DB에서 가져올 필요없이

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

이 방법은, 당신도 회사를 설정할 수 있습니다 :

더 좋은 방법은 단순히 추가 companyId 열없이 많은-to-one 연관을 사용하는 것입니다

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

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

refresh()가 트릭을 수행했는지 확인할 수 있습니다. 이전에 load()를 시도했지만, 이미 캐시 된 객체에 도착했다고 생각합니다. 어쨌든,이 "잡았다"를 감안할 때 나는 당신이 제안하는대로 앞으로 중복되는 매핑을 피할 것입니다. 감사! –

관련 문제