2011-01-05 2 views
1

나는 단순한 객체를 가지고 있으며, 이것은 단지 최대 절전 모드로 매핑된다.Java/Hibernate를 이용한 아카이빙

class SimpleObject { 
    private int id; 
    private String textA; 
    private String textB; 
    private Date date; 
    private Status status; 
    //+getters/setters/other stuff 
} 

이제 내 테이블은 gettig가 매우 거대하기 때문에 (몇 수백만 항목), 나는 정말로 필요 (사용자는 나중에 필요할 수도 있습니다. 실제로 두 테이블을 검색 할 수있는 옵션을 선택하면됩니다.하지만 아직 해결되지 않았으며 다른 곳에서 수행 될 것입니다).
그래서 매핑 파일을 가능한 한 간단하게 유지하고 객체 (아카이브/비 아카이브)를 변환하고 간단한 유산을 사용하기로 결정했습니다.

abstract class AbstractSimpleObject { 
    // idem SimpleObject 
} 

class SimpleObject extends AbstractSimpleObject { 

} 

class SimpleObjectArchived extends AbstractSimpleObject { 

} 

union-subclass를 사용했습니다. 내 최대 절전 모드 매핑 및 SimpleObject를 이전 테이블에 매핑하고 SimpleObjectArchived를 동일한 테이블에 매핑합니다.
이제 모든 것이 정상입니다. 삭제/생성/업데이트 할 수 있습니다. 지금

내 SimpleObjectBusinessRules 클래스에서 나는 메소드 아카이브를 정의한다 :

모든 try/catch /를 생략했다. saoDao.saveAll(...) org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[...] org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:[...]

에서 최대 절전 모드 예외가 발생한다.

누구든지이 문제를 해결하는 방법을 아는 사람? 아니면 누가 이미 최대 절전 모드로 보관 처리하고 더 나은 솔루션 (또는 심지어 최대 절전 모드로 보관하는 작업 솔루션)을 가지고 있습니까?

답변

2

비즈니스 로직 세션에서 하나의 아카이브 세션과 비즈니스 로직 세션에서 두 개의 세션을 만들고 변환 한 객체를 아카이브 세션에 저장하면됩니다. DAO에서 아카이브 메소드를 구현할 수 있습니다. 이렇게하면 많은 문제를 해결할 수 있습니다.

비즈니스 로직의 다른 곳에서 사용되지 않는 한, 나는 당신만큼 멀리 가지 않고 보관 논리로 나의 완전한 상속 계층 구조를 오염시키지 않을 것입니다. 두 개의 세션을 사용하고 다른 스키마 또는 데이터베이스 또는 테이블에 보관 된 레코드를 저장하십시오 (세션의 매핑은 귀하에게 달려 있습니다).

표 : 예외는 매핑 전략으로 인해 발생합니다. Union-Subclass-Mapping을 사용하면 모든 식별자가 동일한 테이블에 저장되므로 아카이브 레코드와 비즈니스 논리 레코드에 동일한 풀의 ID가 제공됩니다. 예외를 피하거나 매핑을 변경하려면 맞춤 생성 전략이 필요합니다. 그러나 문제 (보관 세션)에 대한보다 세련된 솔루션이있을 때 왜 귀찮게합니까?

+1

아카이브에서 삭제하고 삽입하는 사이에 내 개체가 손실되지 않습니다 (어딘가에/어딘가에 문제가있는 경우) ** 어떻게 ** 할 수 있습니까? 그래서 한 세션에서 모든 작업을 수행해야한다고 생각한 이유는 ... – jacob

+1

두 개 이상의 세션에 대해 트랜잭션을 확장 할 수 있습니다. 키워드는 DTC, 분산 트랜잭션입니다. 당신은 Hibernate를 위해 그것들을 가능하게 할 수 있고 두 세션 모두 트랜잭션을 공유 할 것이다. – Falcon

+0

한번 시도해 보겠습니다. 고마워, 지금이야. – jacob