2012-06-26 3 views
2

안녕하세요, 내 프로젝트 중 하나에 대해 많은 관계를 원합니다. 그러나 목록은 채워지지 않습니다.대상에 합성 키가있는 경우 @OneToMany 관계?

나는 부모 소스 클래스를 가지고

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class ParentJob { 
    @Id 
    @Column(name = "ID") 
    int id; 
} 

아이

@Entity 
public class TakeJob extends ParentJob { 
    @OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.REMOVE) 
    @JoinColumn(name="FK_JOBID", referencedColumnName="ID") 
    private List<JobRelation> jobRelations; 
} 

과 PK

@Embeddable 
public class JobRelationPK implements Serializable { 
    private long fkSomething; 
    @Column(name = "FK_JOBID") 
    private long fkJobId; 
} 
와 목표 엔티티

@Entity 
public class JobRelation { 
    @EmbeddedId 
    private JobRelationPK JobRelationPK; 
} 

지금 내가 말했듯이 목록에 액세스하면 그 목록이 채워지지 않습니다. 나는 JoinColumn의 구문에 특히 관심이 있습니다. 왜냐하면 전체 가비지 일지라도 '이름'에 대해 무엇을 넣어야하는지는 중요하지 않으므로 JoinColumn의 구문에 특히 관심이 있습니다. 나는 거기에 넣어 무엇을주의해야합니까 또는 난 그냥

편집 '이름 = "COLUMN_NAME_IN_JOBRELATION"'넣을 수 있습니다 : 나는

답변

1

당신은 먼저 넣어 위치에 일치해야는 EclipseLink 2.3.2을 사용하고 있습니다를 엔티티 계층 구조의 주석. 항상 들판에 올려 놓거나 항상 게터에 올려 놓으십시오. @Id 주석은 id 필드에 있기 때문에 getter의 주석은 무시됩니다.

일단이 값이 수정되면 @JoinColumnname은 조인 열의 이름이어야합니다. 따라서 TakeJob 테이블에 대한 외래 키인 JobRelation 테이블의 열 이름이어야합니다.

+0

나는 그것들을 게터에 가지고 있지만 내 예를 어지럽히고 싶지 않습니다. 두 번째 것에서 그것을 망쳤다. 원래 네가 말한 이름이 있었지만 작동하지 않았다. 그래서 그것이 복합 키와 관련이 있는지 궁금해. –

3

여기의 문제는 아마도 JobRelation 테이블의 "FK_JOBID"필드가 어떻게 설정 될지 예상하는 것과 같습니다.

매핑 된 방식에 따라 포함 된 JobRelationPK의 fkJobId 속성과 TakeJob의 jobRelations 매핑을 통해 쓰기가 가능합니다. JobRelation 엔티티에서만 설정하는 경우 TakeJob 콜렉션은 새로 고칠 때 변경 사항을 반영합니다. JPA는 관계가 데이터베이스의 내용과 일치하도록 유지 보수해야합니다. 즉, 참조가 데이터베이스에있는 것과 동기화되도록 JobJet Collection에 JobRelation을 추가해야하거나 변경이 커밋 된 후에 새로 고침해야합니다.

하지만이 필드에 두 개의 매핑이 있으므로 쓰기 문제가 발생하지 않도록 읽기 전용으로 조인 열을 설정해야합니다.

더 나은 해결책은 JobRelation에서 TakeJob으로 ManyToOne 관계를 설정 한 다음 TakeJob의 jobRelations 매핑을 (joincolumn을 사용하는 대신)이 새 매핑으로 매핑되도록 설정하는 것일 수 있습니다. JPA 2.0을 사용하는 경우 새 매핑을 @MapsId ("fkJobId")로 지정할 수 있습니다. 같은 :

@Entity public class JobRelation { 
    @EmbeddedId 
    private JobRelationPK JobRelationPK; 
    @ManyToOne 
    @MapsId("fkJobId") 
    private TakeJob job; 
} 

이 삽입 될 때 포함 된 fkJobId 속성이 참조 TakeJob 아이디의 값으로 설정 될 수 있습니다.

+0

"또는 변경 사항이 커밋 된 후 새로 고침"요소를 찾은 후'em.refar()'또는'em.refresh()'를 호출하기에 충분합니까? –

+0

기본적으로 JobRelationPK를 사용하여 새 JobRelation을 유지합니다.내가 할 때 TakeJob 객체를 사용할 수 없습니다. 그래서 수동으로 코드에 추가 할 수 없습니다. –

+0

또한 JPA의 요점이기 때문에 JobRelations가 추가되는 위치/시간에 신경 쓸 필요가 없지만 데이터베이스의 데이터에 따라 TakeJob에 추가 할 수 있습니다. Java로 수동으로 추가 할 때 예제가 잘 작동하지만'@ OneToMany' 주석이 필요하지 않습니다. –

관련 문제