2012-04-23 4 views
3

내가 해결하기 위해 다음과 같은 상황을 가지고 있지만 (최대 절전 모드와는 EclipseLink 시도) 작동 가져올 수 없습니다 :JPA : 임베드 클래스의 외래 키

Table_1: 
    Column_A is Primary Key 
    ... some other columns do follow 

.

Table_2: 
Column_x is Primary Key and is Foreign Key to Table_1.Column_A 
Column_y is Primary Key and is Foreign Key to Table_1.Column_A 
Column_z is Primary Key 

따라서 표 2에는 복합 기본 키가 있습니다.

class Table_1 { 
    @Id int Column_A; 
} 

:

나는 그것을 다음과 같은 방법을 실현하기 위해 노력했다. 내가 실행할 때

class Table_2 { 
    @EmbeddedId PK key; 

    @Embeddable class PK { 
    @OneToOne(targetEntity=Table_1.class) 
    @JoinColumn(name="Column_x",referencedColumnName="Column_A") 
    int Column_x; 

    @OneToOne(targetEntity=Table_1.class) 
    @JoinColumn(name="Column_y",referencedColumnName="Column_A") 
    int Column_y; 

    int Column_z; 

    public boolean equals(Object O) { ... } 
    public int hashCode() { ... } 
    } 
} 

그러나, 나는 @Embeddable에 난 단지 "기본"주석을 사용할 수 있음은 EclipseLink에서 힌트를 얻을. 따라서, 내 질문은 위의 그려진 시나리오를 해결하는 방법입니다?

Table_1 클래스의 소스 코드에 액세스 할 수 없지만 그대로 사용해야합니다. 또한 Table_1에 외래 키를 설정하는 클래스/테이블이 더 많이있을 가능성이 높습니다.

답변

1

@IdClass를 사용하십시오.

참조, http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#JPA_2.0

@IdClass(PK.class) 
class Table_2 { 
    @Id 
    @OneToOne(targetEntity=Table_1.class) 
    @JoinColumn(name="Column_x",referencedColumnName="Column_A") 
    Table_1 Column_x; 

    @Id 
    @OneToOne(targetEntity=Table_1.class) 
    @JoinColumn(name="Column_y",referencedColumnName="Column_A") 
    Table_1 Column_y; 

    @Id 
    int Column_z; 

    public boolean equals(Object O) { ... } 
    public int hashCode() { ... } 
    } 
} 

class PK { 
    int Column_x; 
    int Column_y; 
    int Column_z; 
} 
0

당신은 (외부 키보다 생성 된 ID에 대한 더하지 @IdClass) @EmbeddedId를 사용하는 것이 맞다. 귀하의 문제는 그들이 실제로 Table_1 또는 Table_2 클래스에 입력해야 할 때 해당 FK를 정수로 선언한다는 것입니다.