Java 使用注释使用复合密钥类休眠双向一对一
我很难让我的头在这上面。 如何在Organization和OrganizationAddress之间创建一对一的双向映射?这就是我迄今为止所尝试的: 我有两张桌子: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类: @
**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()));
...