2009-08-21 10 views
1

두 번째 얻기 위해 저장Hibernate는 시퀀스에게 나는이 같은 클래스가

public class A{ 
     private B b; 
     private C c; 
} 

내가이 개체를 만드는거야 및 (getter와 setter로를, 모든 오라클 DB에 대한 순서로, 각각 최대 절전 모드로 매핑) 그것을 데이터베이스에 저장합니다.

그래서에는 객체를 생성하고 B 객체를 채우고

saveOrUpdate(a) 

그래서 난 생성 "A"와 "B"시퀀스를 가질 수 부른다. 그런 다음 계산을하고 "C"의 인스턴스를 만들고 "a"로 설정합니다.

여기까지 모든 것이 잘 작동합니다. 나는 이제 "c"의 이드를 얻을 필요가있어서 플러쉬하고 커밋하기 전에 몇 가지 검사를합니다.

하지만 객체가 더 이상 일시적이 아니기 때문에 saveOrUpdate가 작동하지 않습니다. saveOrUpdate에 대한 hibernate 문서에 따르면 : "객체가이 세션에서 이미 영속적이면 아무 것도하지 말 것"

아이디어가 있습니까?

속성 C가 가지고있는 감지 최대 절전 모드보다 (너무 길고 지저분이기 때문에 코드를 게시하지만, 기본적으로 그의 수) C가 최대 절전 모드 매핑 클래스이며, 때에 프로퍼티가 올바르게 매핑되는 경우

답변

0

변경하면 세션이 플러시되거나 활성 트랜잭션이 커밋 될 때 저장됩니다. 그런 다음 커밋 한 후에 C의 ID를 얻을 수 있습니다.

다른 접근 방법은 saveOrUpdate (c)를 호출하는 것입니다. 이 경우 c가 할당 된 ID를 가져 와서 검색 할 수 있습니다.

당신이 c ID를 필요로하고 있는지 확인하고 있습니까?

+0

오른쪽. 하지만 플러시하고 커밋하기 전에 C의 ID가 필요합니다. 두 번째로 "a"에 saveOrUpdate를 호출하는 것은 아무 일도하지 않습니다. "a"가 이미이 세션에서 영속적으로 유지 되었기 때문에 변경되지 않았는지 확인하기도합니다 (DB 제약 조건 때문에 수행 할 수 없습니다.). 쿼리의 id와 url을 만들고 다른 필드에있는 텍스트에 넣으려면 c의 Id가 필요합니다. –

+0

wll, 당신은 saveOrUpdate (c) 호출을 만들어야하기 때문에, hibernate는 당신의 텍스트 필드에 사용할 수있는 id를 할당 할 것이다. 필드가 c의 속성 인 경우 최대 절전 모드로 올바르게 보존됩니다. – Salandur