2013-08-09 2 views
0

우선, 나는 Hibernate의 전문가가 아니라고 말할 필요가있다. 나는 다른 프로젝트에서 그것의 기초만을 사용했다. 하지만 지금은 레거시 데이터베이스 스키마에서 Hibernate를 사용하고 싶지만 테이블을 Java 도메인 모델에 매핑하는 데 어려움을 겪고 있습니다.레거시 데이터베이스에 도메인 모델 매핑

1) 많은 테이블에 할당 된 기본 키 (String)가 있습니다. 사용자가 그래서 그들은 어떤 알고리즘에 따라 생성되지 않습니다. 실제로는 Hibernate가 '자연스러운'키라고 부르는 것들입니다. Hibernate에게 사용자가 할당 한 ID를 받아들이도록 지시하는 방법이 있습니까?

2) 두 번째 문제점은 많은 테이블에 valid_from, valid_to, date_created, date_last_modified, user_last_modified & user_created와 같은 몇 가지 공통 속성이 있다는 것입니다. 이러한 속성은 감사 (어떤 사용자가 어떤 레코드를 변경했는지)와 'valid_to'날짜 필드가 과거 일 때 레코드를 비활성화하는 데 사용됩니다. 나는이 필드를 '메타 데이터'인 것처럼 보이기 때문에 최종 사용자에게 공개하고 싶지 않지만 이러한 필드를 업데이트하는 방법을 찾아야합니다. 레코드가 변경 될 때마다이 필드를 업데이트하는 데 사용할 수있는 일반적인 솔루션이 Hibernate에 있습니까? 정보는 두 테이블 간의 다 대다 관계를 관리하는 데 사용되는 '링크 테이블'에서도 사용됩니다.

모두 도움을드립니다.

업데이트 : 공통 속성을 보유하고 EventListener를 사용하여 이러한 필드를 삽입/업데이트하려면 AbstractEntity를 사용합니다. 사용자는 UserContext.getCurrentUser()에 의해 검색됩니다 (사용자는 ThreadLocal을 사용하여 현재 스레드에 바인딩됩니다).

유일한 문제는 이러한 '연결'테이블을 처리하는 방법입니다 ... 또한 이러한 일반 필드가 포함되어 있으며 이러한 연결 테이블을 매핑하기 위해 별도의 클래스를 만들고 싶지 않습니다. 내 견해로, Hibernate는 그러한 링크 테이블을 감추는 훌륭한 일을한다. 거기에 EventListener와 같은 링크 테이블을 업데이 트하는 방법은?

예 : 테이블 A가 링크 테이블 A_B를 통해 클래스 B와 다 대다 관계를 갖는 경우 레코드가 A 또는 B에 삽입/업데이트 될 때마다 A_B를 업데이트하는 방법이 있습니까?

답변

1

JPA 주석을 사용하여 매핑을 선언한다고 가정합니다.

첫 번째 문제.@GeneratedValue 주석을 적용하지 마십시오.

public class SomeEntityWithAutogeneratedId { 
    @Id 
    @GeneratedValue // autogeneration 
    private Long id; 
} 

public class SomeEntityWithoutAutogeneratedId { 
    @Id 
    private String id; 
} 

두 번째 문제. 일반 필드의 매핑을 단순화하기 위해 기본 클래스를 준비 할 수 있습니다. 당신은 테이블 구조/관계를 검토하고 시작하기 전에 적절하게 변경하는 것이 더 좋을 것이다 최대 절전 모드를 통해 기존 데이터베이스를 사용하려는 경우 일반적으로

public abstract class AbstractEntity { 

    @Column 
    private Date dateLastModified; 

    @PrePersist 
    public void beforePersist() { 
     this.dateLastModified = new Date(); 
    } 
} 

public class Entity1 extends AbstractEntity { 
public class Entity2 extends AbstractEntity { 
public class Entity3 extends AbstractEntity { 
... 
public class EntityN extends AbstractEntity { 

: 그럼 당신은 업데이트를하기 전에 필요한 모든 필드에 대한 정확한 값을 적용 할 @PrePersist을 사용할 수 있습니다 코드를 작성하십시오. 이렇게하면 많은 시간을 절약 할 수 있습니다.

  • 이/자동 생성 된 고유 식별자 (설명을 this entry from the official documentation 참조)
  • 제거와 복합 키를 대체 최대 절전 모드 기능이나 자바 코드 모든 트리거 또는 저장 프로 시저에 의해 대체 : 예를 들어, 더 나은 될 것입니다. 모든 논리가 응용 프로그램 코드에 있으면 캐시 기능을 사용하기 쉽습니다.
  • SQL 데이터베이스는 최대 절전 모드를 통해 쉽게 사용할 수없는 훨씬 더 강력한 기능을 제공하기 때문에 매우 긴 목록을 가질 수 있습니다.
관련 문제