2011-01-28 13 views
3

複合主キーとJPA 2/Hibernateで動作する外部キーを取得できません。私は、国と地方との単純なシナリオを作成しようとしています:JPA 2 - 複合主キーの1つのフィールドのみを含む外部キー?

国エンティティ:

@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つの例外を除いて私のために正しい表を作成してください:

国表:

  1. コードPK

省の表

  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クラス内の属性の名前に一致している必要があります。 @JoinColumnにはinsertable=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; 
} 

希望します。

関連する問題