2011-01-28 1 views
3

JPA 2/Hibernate에서 작동하는 합성 기본 키와 외래 키를 가져 오는 데 문제가 있습니다.JPA 2 - 합성 기본 키의 한 필드 만 포함하는 외래 키?

나라 법인 :

@Entity 
@Table(name = "country") 
public class Country extends DomainObjectBase implements Serializable { 

    @Id 
    @Basic(optional = false) 
    @Column(name = "code") 
    private String code; 

    @Basic(optional = false) 
    @Column(name = "name") 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "country") 
    private List<Province> provinces; 
} 

주 기본 키 :

@Embeddable 
public class ProvincePK implements Serializable { 

    @Basic(optional = false) 
    @Column(name = "code") 
    private String code; 

    @Basic(optional = false) 
    @Column(name = "country_code") 
    private String countryCode; 
} 

지방 법인 :

@Entity 
@Table(name = "province") 
public class Province extends DomainObjectBase implements Serializable { 

    @EmbeddedId 
    protected ProvincePK provincePK; 

    @Basic(optional = false) 
    @Column(name = "name") 
    private String name; 

    @MapsId("country_code") 
    @JoinColumn(name = "country_code", referencedColumnName = "code", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Country country; 
} 

이를 나는 국가와 지방 간단한 시나리오를 만들려고 해요 단 하나의 예외를 제외하고 나를 위해 올바른 테이블을 만드십시오 :

나라 테이블 :

  1. 코드 PK
  2. 이름

지방 표

  1. 코드 PK FK - 문제는가에 대한 외래 키 참조를 만드는 곳 이입니다 컨트리 테이블의 코드 열
  2. coun try_code FK 이것은 내가 원하는 스키마를 생성하는 최대 절전 모드에 대한

가 어떻게 내 개체를 매핑 할 이름/복합 키를 원하는 유일한 외래 키 참조입니까? 해당 국가에 지방 코드가 포함되어 있기 때문에 지금은 지방에 어떤 데이터도 삽입 할 수 없습니다!

도움 주셔서 감사합니다.

답변

2

시도해보십시오. 나는 이런 데이터 모델로 작업 할 때 저에게 효과가 있다는 것을 발견했습니다.

@Entity 
@Table(name = "province") 
@IdClass(ProvincePK.class) 
public class Province extends DomainObjectBase implements Serializable { 

    @Id 
    @Basic(optional = false) 
    @Column(name = "code") 
    private String code; 

    @Id 
    @Basic(optional = false, insertable = false, updatable = false) 
    @Column(name = "country_code") 
    private String countryCode; 


    @Basic(optional = false) 
    @Column(name = "name") 
    private String name; 

    @JoinColumn(name = "country_code", referencedColumnName = "code") 
    @ManyToOne 
    private Country country; 

} 
0

@MapsID 인수는 ProvincePK 클래스 속성의 이름과 일치해야합니다. @JoinColumninsertable=true,updatable=true으로 표시되어야합니다. 여기에 코드가 있습니다 -

@Entity 
@Table(name = "province") 
public class Province implements Serializable { 

@EmbeddedId 
protected ProvincePK provincePK; 

@Basic(optional = false) 
@Column(name = "name") 
private String name; 

@MapsId(value = "country_code") 
@JoinColumn(name = "country_code", referencedColumnName = "code") 
@ManyToOne(optional = false) 
private Country country; 

} 

@Embeddable 
public class ProvincePK implements Serializable { 

@Basic(optional = false) 
@Column(name = "code") 
private String code; 

@Basic(optional = false) 
@Column(name = "country_code") 
private String country_code; 
} 

@Entity 
@Table(name = "country") 
public class Country implements Serializable { 

@Id 
@Basic(optional = false) 
@Column(name = "code") 
private String code; 

@Basic(optional = false) 
@Column(name = "name") 
private String name; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "country") 
private List<Province> provinces; 
} 

희망이 있습니다.