2010-07-24 9 views
8

일부 엔티티에 대한 jpa 매핑을 설정하는 데 문제가 있습니다. 부모 엔티티는 다음과 같이 정의되어 있습니다.jpa hibernate 복합 외래 키 매핑

@Entity 
@Table(name="EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(generator="eif_inst_gen") 
@SequenceGenerator(name="eif_inst_gen",sequenceName="EIF_INSTANCE_SEQ") 
@Column(name = "EAIH_ID") 
private Long eaihid; 
@Column(name = "EAD_ID") 
private Long eadid; 

@OneToMany(targetEntity=InstanceNotifyEntity.class, mappedBy="instance",fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 
다음과 같이 그때 복합 키/w 아이 엔티티,이 테이블의 기본 키 외래 키가

:

@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable{ 

private static final long serialVersionUID = 1L; 

@Id 
@ManyToOne 
@JoinColumn(name="EAIH_ID", referencedColumnName="EAIH_ID") 
private InstanceEntity instance; 

@Id 
@Column(name="USER_ID") 
private Long userId; 
@Column(name="COMMENT_TXT") 
private String commentText; 
} 

나는 아이 엔티티가 잘못 알고,하지만 난 이것을 복합 PK로 설정하는 방법을 잘 모르겠습니다. PK 클래스를 설치해야한다는 것을 알고 있지만 한 필드가 부모 클래스에 대한 외래 키일 때 어떻게 수행해야할지 모르겠습니다. 일단 설정이되면 부모가 자식 엔티티를 어떻게 참조합니까?

도움을 주시면 감사하겠습니다.

+0

참조 http://stackoverflow.com/questions/2562746/jpa-entity-design-problem/ 2563009 # 2563009 – axtavt

답변

12

이 내용은 JPA 2 spec 섹션 2.4.1, "파생 된 ID에 해당하는 1 차 키"의 적용을받습니다. 이 절에는 문제에 직접 적용 할 수있는 두 가지 예제가 들어 있습니다.

  • @IdClass
  • @EmbeddedId

가 여기에 EmbeddedId 방법의 대략적인 스케치의 : 사양에 설명 된대로

,이 경우 자식 엔티티의 키를 표현하는 방법에는 두 가지가 있습니다. 내가 임의로 EmbeddedId을 선택했지만 IdClassEmbeddedId 사이의 선택이 중요합니다. 다르게 선택할 수 있습니다.

// Child entity's composite primary key 
@Embeddable 
public class InstanceNotifyEntityId implements Serializable { 
    Long eaihId; 
    Long userId; 
} 

// Child entity 
@Entity 
@Table(name="EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 
    @AttributeOverrides({ 
     @AttributeOverride(name="userId", column = @Column(name="USER_ID")) 
     @AttributeOverride(name="eaihId", column = @Column(name="EAIH_ID")) 
    }) 
    @EmbeddedId 
    InstanceNotifyEntityId id; 

    @MapsId("eaihId") 
    @ManyToOne 
    InstanceEntity instance; 

    // ... 
} 

는 부모 엔티티는 하나의 변화를 필요로하십시오 userDetails 속성 mappedBy는 "id.eaihId"이어야합니다. 그게 다라고 생각하지만 이전과 똑같은 실체를 사용하지 않았습니다. 뭔가를 놓친 경우 ... 오류가 표시되면 게시하십시오.

+0

감사합니다.이 기능은 대부분 작동합니다. 불행히도 @MapsId 주석을 사용할 수 없도록 jpa 2.0을 사용하지 않습니다. 부모 엔터티 userDetails 개체에서 캐스케이드 관계를 제거하여 삽입에 대한 작업을했습니다. 따라서 부모 요소를 유지 한 후에 각 자식 요소를 삽입해야하지만 현재는 사용할 수 있습니다. – broschb

+0

@broschb 무엇을 사용하고 계십니까? –

+0

jpa 1.0 스펙. 현재 jboss 4.2.3을 사용해야합니다. jpa 2.0은이 응용 프로그램 서버에서 작동하지 않습니다. 최소한 여러 개의 라이브러리를 교체하지 않아도됩니다. – broschb

0

나는 또한 동일한 문제에 직면했고이 해답을 따랐지만 상위 엔티티가있는 하위 엔티티를 저장하지 않습니다. 여기에 내가 만든 변경 사항이 있으며 잘 작동합니다. 변경 아래 확인 -

// Child entity's composite primary key class 

public class InstanceNotifyEntityId implements Serializable { 

    @Column(name = "USER_ID") 
    Long userId; 

    @JoinColumn(name = "EAIH_ID") 
    @ManyToOne 
    InstanceEntity instance 
} 

// Child entity which contain composite primary key as a EmbeddedId, 
// no need to define any relationship here as we already define 
// the relationship in composite key class. 

@Entity 
@Table(name = "EIF_INST_NOTIFIED") 
public class InstanceNotifyEntity implements Serializable { 

    @EmbeddedId 
    InstanceNotifyEntityId id; 
} 


// Parent entity (parent entity mappedby should be your composite 
// key class instance.child class object which already have the 
// join column mapping with "EAID_ID") 

@Entity 
@Table(name = "EIF_INSTANCE_HDR") 
public class InstanceEntity implements Serializable { 

    @OneToMany(mappedBy = "id.instance,fetch=FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>(); 
} 

을 부모 개체가 id.setInstance(parent entire obj) 같은 복합 키에 부모 객체를 설정 저장하는 동안

관련 문제