2009-12-22 1 views
6

처음에는 Java Webapp, Spring, Hibernate, MySQL.Hibernate 기반 애플리케이션을위한 데이터 히스토리/버전 관리 솔루션 구현 (비틀어 짐)

상황은 내가 복잡한 개체 모델을 가지고 있습니다. a 자동차. 그것은 으로, 많은 개체 (엔진, 타이어, ...)와 다 대일 및 일대 다 관계로 구성되어 있습니다.

지금은 많은 자동차가 있으며, 지금은 누군가가 자동차를 검사하고 보고서 검사를 만듭니다. 보고서는 자동차의 많은 부분을 나타내며 그 속성을 표시합니다.

지금까지 시스템은 자동차에 공급 된 자동차 및 부품의 속성을 업데이트하는 기능을 지원하지 않았습니다. 의미는 섀시 나 타이어 개수가 바뀌면 오래된 보고서는 우리가 원하는 바가 아닌이 변화를 반영한다는 것입니다.

이제이 기능이 요청되었습니다. 자동차와 부품은 수정이 가능해야하며 버전 기록을 작성해야합니다. 이전 보고서는 이전 버전의 파트와 해당 값을 참조해야합니다.

""을보고 있었는데 자동차 및 부품의 버전 관리가 유형 6 접근 방식으로 수행 될 수 있습니다.

나는 문제 (아마도 내 제한된 최대 절전 모드 경험을) 알아내는 데 문제 건 (트위스트)이있다 : 그들은 참조하도록

어떻게 최대 절전 모드 내 보고서 인스턴스를 조립할 수 자동차의 각 부분의 올바른 버전? 보고서에는 날짜가 있고 자동차 부품의 각 버전에는 유효한 날짜 범위가 있으므로 일부 복잡한 HQL/SQL을 사용하여 수행 할 수 있다고 생각합니다. 그러나 Hibernate를 사용하여 더 쉽고 자동으로 수행 할 수있는 방법이 있습니까?

답변

1

나는 당신이 (타입 6) (하이버 네이트와 함께 제안한 접근법을 사용했고 그것은 나를 위해 잘 작동했다. 같은 검색어가 모든 검색어에 필요했기 때문에 보고서에 대한 검색어는 다소 복잡해졌지만 그렇게 많이는되지 않았습니다 (예 : 'and : reportTime> = x.startTime and (: reportTime < x.endTime 또는 x.endTime is null).) ').

2 가지 속성 (예 : startTime 및 endTime)으로이 접근 방식을 지원하는 엔티티에 대한 인터페이스와 기본 클래스 (인터페이스는 부모가 시간상 하위가 아닌 시간 하위 클래스에만 필요함) 및 DAO 작동을위한 기본 클래스 일부 기능이 필요할 때가 있습니다. 나는이 기본 DAO에 넣어 것들 :

  1. 새로운 경우 이전 인스턴스를 (즉, endTime- 사용자를 작성)
  2. 자동 폐쇄 (미래의 시간으로 endTime- 사용자 설정을 제외하고) 통과했다 startTime을 경우에 그 변경을 방지 인스턴스가 추가되었습니다 (예 : oldInstance.endTime = newInstance).startTime)
  3. 표준 절을 추가하여 HQL 쿼리를 쿼리 할 때 현재 엔터티를 선택합니다. 어떤 이유로 두 개의 유효한 인스턴스/버전이 한 순간에 발견 된 경우 중복 다루기
  4. 는 (나는 'startTime을 내림차순'으로 내 쿼리를 주문하고 첫 번째 반환했다)

에게 유일한 부분을 어디 데이터베이스에 대해 실행되는 일반 SQL 쿼리로 작업하는 것이 정말 엉망이었습니다. 조인 된 테이블이나 하위 선택에 여분의 절이 필요했습니다.

+0

이것은 우리가 취한 접근 방식과 거의 같았습니다. – Janne

1

MySQL은 triggers을 지원합니다. 행이 변경 될 때마다 트리거가 행을 시간 소인과 함께 "아카이브"테이블로 복사하도록 트리거를 설정하십시오. 이렇게하면 보고서를 실행할 수있는 모든 이전 데이터 버전이 유지됩니다.

6

개체 버전 지정에 대해서는 JBoss envers을 살펴볼 수 있습니다. 나는 그것이 당신의 유스 케이스에 적합하다고 확신하지는 않지만 그것을 보아라.

+0

팁 주셔서 감사합니다. Envers는 매우 유용하지만 보이지 않는 상황에 적합합니다. 어쨌든 그것이 존재한다는 것을 알고 있습니다. – Janne

관련 문제