JPA 2 - 仅包含复合主键中的一个字段的外键?

我在使用JPA 2 / Hibernate中的复合主键和外键时遇到问题。我正在尝试用国家和省份创建一个简单的场景: 国家实体:
@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;
}
这为我创建了正确的表,但有一个例外: 国家表: 代码PK 名称 省表 代码PK FK - 问题在于它创建了对country table的代码列的外键引用 country_code FK这是我想要的唯一外键引用 名称 如何映射hibernate的实体/组合键以生成我想要的模式?现在我无法将任何数据插入省,因为它期望该国家/地区包含省代码! 谢谢你的帮助。     
已邀请:
试试这个。当我使用这样的数据模型时,我发现它对我有用。
@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;

}
    
@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;
}
希望能帮助到你。     

要回复问题请先登录注册