2014-09-04 4 views
0

우리는 양방향 데이터로 모든 개체 변경을 추적하는 응용 프로그램을 보유하고 있습니다. 각 개체는 있습니다JPA Envers를 사용한 Bi 임시 감사 데이터

@Embeddable 
public class AuditInfo { 
    private Date effectiveFrom; 
    private Date effectiveTo; 
    private Date asOf; 
    private Boolean isCurrent; 
} 

그러나 우리는 새 레코드를 삽입 대해 IsCurrent = 거짓과 이전을 업데이트하고 현재 날짜 시간을 가진 effectiveTo 날짜를 업데이 트하려는 기업의 갱신에.

Spring Jpa-Envers에서이를 수행 할 수 있습니까?

하이버 네이트 인터셉터를 연결하고 나중에 인터셉터 내에서 엔티티 필드 만 수정할 수 있다는 것을 알았고 그 이상의 것을 할 수 없다는 것을 알았습니다.

나는 이것을 달성 할 수있는 서비스 계층을 쉽게 추가 할 수 있지만 교차 절단 문제로 서비스에 속하지 않는 것처럼 들린다.

우리가 다루고있는 다른 것은 사용자 정의 저장소가 있고 save() 메소드를 대체하는 것입니다.

의견을 보내 주셔서 감사합니다.

답변

0

Envers에있는 엔티티의 이전 버전은 별도의 테이블에 저장됩니다. 따라서 isCurrent이라는 플래그는 주 테이블에있는 것이 현재 버전이므로 의미가 없습니다. effectiveTo/effectiveFrom 필드가 변경되면 새 개정이 감사 테이블에 삽입됩니다.

다른 유효 기간이 이고 다른 ID가 인 엔티티가있는 경우 엔 JPA 만 별도의 엔티티로 모델링하면됩니다.

신원이 동일하면 Envers의 훌륭한 유스 케이스입니다.

+0

답해 주셔서 감사합니다. –

+0

엔티티를 생성 할 때 effectiveTo 날짜는 미래 (+100 년)입니다. 엔티티가 수정되면 이전 버전을 effectiveTo = sysdate-1로 새 버전을 effectiveFrom = sysdate로 업데이트하려고합니다. 이렇게하면 특정 날짜의 엔터티를 쿼리하는 것이 더 쉬워집니다. 엔티티에 대해서만 유효한 것으로부터도 달성 될 수 있지만 질의가 훨씬 더 복잡하다는 것을 의미합니다. 이전 방문을 업데이트 할 수 있습니까? –

+0

아니요, 수정본을 변경할 수 없습니다. 그러나 여러분의 경우 다른 버전의 엔티티는 서로 다른 ID를 가지고 있으므로 JPA를 사용하여 별도의 엔티티로 모델링하고 JPA를 사용하여 쿼리해야합니다. Envers는이 경우 많은 것을 제공하지 않습니다. – adamw