2011-06-14 4 views
1

의 내가 다음과 같은 클래스 구조 있다고 가정 해 봅시다 : 이유필드를 다른 최대 절전 모드 엔터티로 가리 키도록 최대 절전 모드 주석이 적용된 클래스를 확장하려면 어떻게합니까?

/** Boring bits snipped */ 
@Entity 
@Table(name = "Foo") 
public class Foo { 
    @JoinColumn(name = "id") 
    private Bar bar; 
    /** Other flat data goes here */ 
} 

@Entity 
@Table(name = "Bar") 
public class Bar { 
    /** Some data goes here */ 
} 

내가에 들어갈 않을거야, 나는 자바에 나타납니다 나는 또한 너무 매핑 할이 테이블의 복사본을 또한 FooBar 개체가됩니다. 가장 중요한 점은 복사 된 객체를 처리 할 때 테이블 간의 관계가 복사 된 테이블 사이에 있어야합니다.

가장 올바른 방법은 무엇입니까?

@Entity 
@Table(name = "OtherFoo") 
public class OtherFoo extends Foo { 
    @JoinColumn(name = "id") 
    private OtherBar bar; 
} 

@Entity 
@Table(name = "OtherBar") 
public class OtherBar extends Bar { 
} 

그러나 이 올바른 방법으로 그것을 할 것입니다 :

나는 아마 이런 식으로 뭔가를 할 수 같은데요?

+0

일반적으로 미니 프로젝트를 만들고 이것을 테스트 할 수 있지만 현재로서는이 작업을 수행 할 수있는 위치에 있지 않습니다. ( – SCdF

답변

2

너는 끝났지 만, 다른 엔티티로부터 상속 받고 그런 식으로 테이블을 변경할 수는 없습니다. 엔티티 상속은 제공된 상속 모델 중 하나를 따라야합니다. 수퍼 클래스에 @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)을 추가하는 것과 같은 간단한 사용 사례 일 수 있습니다. 다른 클래스와 좀 더 복잡한 매핑이있는 경우 몇 가지 제한이 있습니다. 수퍼 클래스 기반 매핑이 실제로 어떤 테이블인지 알 수 없으므로이를 통해 조인 할 수 없습니다. 그리고 수퍼 클래스에 매핑 할 때마다 두 테이블을 모두 확인해야합니다. 물론 계층 구조의 모든 테이블에서 고유 한 ID 생성이 필요합니다. 추상 수퍼 클래스를 사용하고 두 구체 엔티티 모두 리프 클래스가되도록 고려하는 것이 좋습니다. 그렇다면 적어도 하나의 테이블을 알고있을 때 항상 하나의 테이블로 작업 할 수 있습니다.

또는 @MappedSuperclass에서 열 매핑을 선언 할 수 있으며 각 하위 클래스는 테이블 매핑이있는 엔티티가 될 수 있습니다. 레거시 데이터이고 '일반'테이블과 '복사'테이블에서 고유 한 ID가없는 경우 더 효과적 일 수 있습니다.

+0

두 개의 하위 클래스가있는'@ MappedSuperClass'를 갖는 것과 같은 소리가납니다. 감사합니다. :) – SCdF