Java 使用注释使用复合密钥类休眠双向一对一

Java 使用注释使用复合密钥类休眠双向一对一,java,hibernate,annotations,one-to-one,composite-primary-key,Java,Hibernate,Annotations,One To One,Composite Primary Key,我很难让我的头在这上面。 如何在Organization和OrganizationAddress之间创建一对一的双向映射?这就是我迄今为止所尝试的: 我有两张桌子: **ORGANISATION** ORGNO <pk> BANKNO <pk> **ORGANISATION_ADDRESS** ORGNO <pk, fk> BANKNO <pk, fk> 及 这是Organization和OrganizationAddress的Java类: @

我很难让我的头在这上面。 如何在Organization和OrganizationAddress之间创建一对一的双向映射?这就是我迄今为止所尝试的:

我有两张桌子:

**ORGANISATION**
ORGNO <pk>
BANKNO <pk>

**ORGANISATION_ADDRESS**
ORGNO <pk, fk>
BANKNO <pk, fk>

这是Organization和OrganizationAddress的Java类:

@Entity
@Table(name="ORGANISATION")
public class Organisation implements Serializable{

    @Id
    private OrganisationPK comp_id;

    /** bi-directional one-to-one association to OrganisationAddress */
    @OneToOne(mappedBy = "organisation", cascade = CascadeType.ALL)
    private OrganisationAddress organisationAddress;
}

当我运行测试时,会出现以下错误:

org.hibernate.TypeMismatchException:为类org.hibernate.organizationAddress提供了错误类型的id

预期:类org.hibernate.organizationAddressPK,获得类org.hibernate.organizationPK

此电话:

private void deleteOrganisation(Organisation organisation){
    Organisation hibOrganisation = (Organisation) getCurrentSession().get(
        Organisation.class, new OrganisationPK(
            organisation.getOrgNo(), BANKNO.getValue()));
...

您不能在OrganizationAddress中使用OrganizationPK吗?OrganizationPK和OrganizationAddressPK使用相同的列来构成键。Hibernate可能使用与列组合匹配的第一个类。为了清楚起见,您可以使用一个通用名称作为密钥。OrganizationPK和OrganizationAddressPK除了主键之外完全不同,所以我想保留它们。但是我找到了这个链接,所以明天我将尝试这种方法。唯一的缺点是他们使用一对多。
@Entity
@Table(name="ORGANISATION")
public class Organisation implements Serializable{

    @Id
    private OrganisationPK comp_id;

    /** bi-directional one-to-one association to OrganisationAddress */
    @OneToOne(mappedBy = "organisation", cascade = CascadeType.ALL)
    private OrganisationAddress organisationAddress;
}
@Entity
@Table(name="ORGANISATION_ADDRESS")
public class OrganisationAddress implements Serializable {

    @Id
    @AttributeOverrides({
            @AttributeOverride(name = "orgno", column=@Column(name="ORGNO")),
            @AttributeOverride(name = "bankno", column=@Column(name="BANKNO"))
    })
    private OrganisationAddressPK comp_id;

    /** bi-directional one-to-one association to Organisation */
    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumns({
            @PrimaryKeyJoinColumn(name = "ORGNO", referencedColumnName = "ORGNO"),
            @PrimaryKeyJoinColumn(name = "BANKNO", referencedColumnName = "BANKNO")
    })
    private Organisation organisation;
private void deleteOrganisation(Organisation organisation){
    Organisation hibOrganisation = (Organisation) getCurrentSession().get(
        Organisation.class, new OrganisationPK(
            organisation.getOrgNo(), BANKNO.getValue()));
...