2012-07-23 3 views
0

우선, 나는 JPA와 Hibernate Annotations를 처음 사용했다.Hibernate JPA 상속 id 매핑

데이터 액세스 레이어에서 hibernate 3.5 및 hbm.xml을 기반으로하는 많은 시스템과 솔루션이 현재 프레임 워크에서 개발되었습니다. 이제 hibernate 4.1과 Annotation으로 이동하여 hbm.xml 파일을 제거하기로 결정했습니다.

하지만 여기에 내 문제가 있습니다.

"id"와 "version"과 같은 다른 필드가 들어있는 GenericEntity라는 모든 엔티티에 대한 기본 클래스가 있습니다. 이 GenericEntity 은 실제 테이블에 직접 매핑 된이 아니며 각 엔티티는 이러한 필드를 실제 테이블/열로 매핑해야합니다.

public abstract class GenericEntity implements Serializable { 

    public static final short UNSAVED_VALUE = -1; 

    private long id = UNSAVED_VALUE; 
    private int version; 

    ... getters and setters 
} 

public class User extends GenericEntity { 

    private String username; 
    private String password; 
    ... getters and setters 
} 

과 hbm.xml이

입니다 :

이제 주석에, 나는 실체

여기

내가 가진 무엇의 ID와 버전 필드/주석을 생략 할 수있는 방법을 찾을 수 없습니다

<class name="my.User" table="TBL_USER" optimistic-lock="version"> 
    <id name="id" column="USR_ID" unsaved-value="-1"> 
     <generator class="identity"/> 
    </id> 

    <version name="version" column="USR_VERSION"/> 
    <property name="username" column="USR_USERNAME" type="string" /> 
    <property name="password" column="USR_PASSWORD" type="string" /> 
</class> 

GenericEntity에 대한 매핑이없고 GenericEntity에 대한 User에 대한 상속 매핑이 없습니다.

어떻게 특수 효과를 사용할 수 있습니까? !!

솔루션은 getId 및 setId를 추상 메서드로 정의하는 것이지만 ID와 버전을 수천 개의 내 개체에 추가 할 수 없습니다.

또한 GenericEntity에 대해 최대 절전 모드를 사용할 수 없습니다. 왜냐하면 현재 테이블을 쉽게 변경할 수 없으며 다른 한편으로는 성능에 많은 불이익을 당하기 때문입니다.

또한 내 프레임 워크의 다른 부분의 변경을 최소화하고 싶습니다. GenericEntity는 DAL에서 널리 사용됩니다.

감사합니다.

Meysam Te.

답변

4

GenericEntity 클래스에 @MappedSuperclass이라는 주석을 달고 각 엔터티에 @AttributeOverride(s)이라는 주석을 달면됩니다.

주석의 javadoc에서 설명합니다.

+0

탱크, 내 시간을 절약했습니다. 하지만 "GeneratedValue 전략"에 문제가 있습니다. 어딘가에 IDENTITY가 있어야하며 어딘가에 SEQUENCE가 필요합니다. 하위 클래스에서이를 어떻게 재정의 할 수 있습니까? –