4

我无法让复合主键和外键在 JPA 2/Hibernate 中工作。我正在尝试创建一个包含国家和省份的简单场景:

国家实体:

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

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

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

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

这为我创建了正确的表,但有一个例外:

国家表:

  1. 代码PK
  2. ...

省份表

  1. code PK FK -这是问题在于它创建对国家表的代码列的外键引用
  2. country_code FK这是我想要的唯一外键参考
  3. ...

如何映射我的实体/复合键以用于休眠以生成我想要的模式?现在我无法将任何数据插入省,因为它期望该国家包含省代码!

谢谢你的帮助。

4

2 回答 2

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;
            
    @JoinColumn(name = "country_code", referencedColumnName = "code")
    @ManyToOne
    private Country country;
}
于 2011-01-29T02:38:14.887 回答
1

@MapsID参数必须与ProvincePK类中的属性名称匹配。@JoinColumn应该被标记insertable=true,updatable=true,然后它的工作原理。这是代码 -

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

    @EmbeddedId
    protected ProvincePK provincePK;

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

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

希望能帮助到你。

于 2017-07-07T20:39:33.800 回答