2011-01-28 63 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

省表

  1. 碼PK FK - 這是哪裏的問題是它的創建外鍵引用國家表代碼欄
  2. council try_code FK 這是唯一的外鍵引用我想

如何映射我的實體/複合體對Hibernate來生成我想要的架構鍵?現在我不能在省內插入任何數據,因爲它期望該國家包含省代碼!

感謝您的任何幫助。

回答

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; 
} 

希望它有幫助。