2011-11-25 4 views
1

나는 기본 클래스 A과 두 개의 서브 클래스 BC을 가지고있다. 내가 B의 인스턴스를 가지고 있는데, 타입을 C으로 업데이트하고 변경하려고합니다. 업데이트 된 데이터가 포함 된 C의 인스턴스는 일시적입니다. 영구 인스턴스를 수정할 어쨌든 상상할 수 없기 때문입니다.Hibernate joined-subclass update

일시적인 인스턴스가 프런트 엔드에서 서비스 계층으로 전달되면 세션이 시작되고 일부 세션이 올바른 작업인지 확인하기 위해 세션이 시작됩니다. 이 세션 동안 지속적 인스턴스 (B)가 검색됩니다. 모든 것이 체크 아웃된다고 가정하면, 일시적인 객체는 지속될 것으로 예상됩니다.

올바른 방법으로는 .merge()이 호출되는 것처럼 보일 수 있지만 .update() (작동하지 않으며 영구 인스턴스가 현재 세션에 있기 때문에) 호출하지 않은 것처럼 NonUniqueObjectException이 발생합니다. .

이유는 .merge()이이 상황을 위해 의도 된 것이므로 .merge()이 NonUniqueObjectException을 제공하는 이유를 알지 못합니다. 일시적인 인스턴스로 세션에있는 엔티티를 업데이트하려고합니다. 내 생각에은 지속적인 인스턴스가 일시적인 인스턴스와 다른 클래스라는 사실에 화가났습니다. 테스트 한 결과 동일한 클래스의 임시 인스턴스에서 .merge()을 호출하면 모든 것이 예상대로 작동합니다.

다음에 무엇을해야할지 모르겠지만 영구 인스턴스의 .evict()을 수행하고 .update()을 시도했지만 StaleObjectException이 발생합니다. 이 시점에서 나는 해결책을 찾을 수 없다. 우리가 바보 같은 짓을하려고하거나 구성 문제가있을 수 있습니까?

답변

0

Java 또는 최대 절전 모드에서는이 작업을 수행 할 수 없습니다. 데이터베이스에서 직접 SQL 쿼리를 통해서만 가능합니다 (최대 절전 모드를 우회). 최대 절전 모드에서 수행해야하는 작업은 B을 삭제하고 C을 새로 만듭니다. 모든 참고 문헌과 관계 (분명히 A에 존재)를 손으로 관리해야합니다. C will also be assigned a new id (in case that A`에는 자동 증가 ID 등이 있습니다).

+0

그래서 문제는 하위 클래스를 변경하는 것입니까? 나는 그것이 지원되지 않는다는 것을 조금 허락했다. –

+0

예. 어쨌든 Java에서 어떻게 할 수 있습니까? 당신은 할 수 없습니다. – cherouvim