2010-03-21 4 views
4

나는 @MappedSuperclass 주석이 달린 AbstractEntity라는 클래스를 가지고있다. 그런 다음 AbstractEntity를 확장하는 User (@Entity)라는 클래스가 있습니다. 이 두 가지 모두 foo.bar.framework라는 패키지에 있습니다. 이 두 클래스를 사용할 때 모든 것이 잘 작동합니다. 하지만 이제는이 파일들이 들어있는 병을 다른 프로젝트로 가져 왔습니다. User 클래스를 재사용하고 몇 가지 추가 필드로 확장하고 싶습니다. 나는 @Entity public class User extends foo.bar.framework.User이 트릭을 할 것이라고 생각했지만,이 사용자 구현은 AbstractEntity의 필드 만 상속 받지만 foo.bar.framework.User의 필드는 상속받지 않는다는 것을 알았습니다. 질문은, 두 번째 User 클래스가 첫 번째 User 엔터티 클래스의 모든 필드를 상속 받도록하려면 어떻게해야합니까?엔터티 확장하기

두 가지 사용자 클래스 구현에는 @Table (name = "name")으로 정의 된 다른 테이블 이름이 있습니다.

내 클래스는 EclipseLink는 "FIRSTNAME을" "myappuser"필드 "ID", "consistencyVersion"를 포함라는 이름의 테이블을 생성합니다,이

 

package foo.bar.framework; 

@MappedSuperclass 
abstract public class AbstractEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 

    @Column(nullable = false) 
    @Version 
    protected Long consistencyVersion; 

    ... 
} 
 
위의 코드와
 

package foo.bar.framework; 

@Entity 
@Table(name = "foouser") 
public class User extends AbstractEntity { 

    protected String username; 

    protected String password; 

    .... 
} 
 
 

package some.application; 

@Entity 
@Table(name = "myappuser") 
public class User extends foo.bar.framework.User { 

    protected String firstname; 

    protected String lastname; 

    protected String email; 

    .... 
} 
 

처럼 , "성"및 "전자 메일". "username"과 "password"필드는 테이블에 생성되지 않습니다. 이것이 바로 제가 겪고있는 문제입니다.

+1

어떻게 abstractuser의 필드 만 상속 받았는지 확인 했습니까? – Bozho

+1

더 많은 코드를 보여주고 기대하는 것과 얻을 수있는 것을 설명하십시오 (자바 레벨과 db 레벨 모두). –

+0

@Bazho, 내 코드를 실제 데이터베이스 테이블과 비교했습니다. @ 파스칼 Thivent, 당신이 요청한 정보가 포함되어 있습니다. –

답변

4

JPA의 경우 기본 상속 전략 (지정되지 않은 경우)은 SINGLE_TABLE입니다. 상속 계층 구조 당 하나의 테이블 만 있고 모든 필드는 기본 클래스의 테이블에 유지됩니다.

상속 계층 구조의 각 클래스에 대한 테이블을 갖고 각 테이블에 상속 된 모든 필드에 대한 열을 포함하려면 TABLE_PER_CLASS 전략을 사용해야합니다.

package foo.bar.framework; 

@MappedSuperclass 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
abstract public class AbstractEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    protected Long id; 

    @Column(nullable = false) 
    @Version 
    protected Long consistencyVersion; 

    ... 
} 
+1

이것은 정확하다. 그러나 이것은 내 문제를 완전히 해결하지 못했다. 같은 이름을 가진 두 엔티티를 가질 수없는 것 같습니다 (다른 패키지에 있더라도). 이것은 프레임 워크의 User 테이블이 생성되지 않았 음을 의미합니다. 실제로 EclipseLink는이를 완전히 무시한 것처럼 보였습니다. 내 문제를 해결하기 위해 다른 사용자 엔티티 클래스의 이름을 바꾸고 제안한 변경 사항을 수행해야했습니다. –