Java 在hibernate中使用共享外键列映射两个实体
我有四个实体要映射在一起,“关联”、“帐户”、“交易”和“TransactionEvent”。关联的id是一个简单的整数id。帐户和事务的每个id都包含一个映射到关联和一个数字的嵌入式id TransactionEvent应该有一个由一个帐户和一个关联组成的嵌入式id。现在,每一个都映射到一个关联,我希望它对于一个TransactionEvent是相同的关联 JPA注释用于Hibernate映射,但我无法做到这一点。我曾尝试为关联键强制使用相同的列名,但Hibernate抱怨列重复 这是可能解决的,还是我没有思考清楚 下面是带注释的类,但我删除了getter/setter和非id列,即javax.persistence命名空间中的注释:Java 在hibernate中使用共享外键列映射两个实体,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我有四个实体要映射在一起,“关联”、“帐户”、“交易”和“TransactionEvent”。关联的id是一个简单的整数id。帐户和事务的每个id都包含一个映射到关联和一个数字的嵌入式id TransactionEvent应该有一个由一个帐户和一个关联组成的嵌入式id。现在,每一个都映射到一个关联,我希望它对于一个TransactionEvent是相同的关联 JPA注释用于Hibernate映射,但我无法做到这一点。我曾尝试为关联键强制使用相同的列名,但Hibernate抱怨列重复 这是可能解决
@Entity
public class Association implements Serializable {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private long id;
}
实际账户、交易和AccountEvent实体在表格中
@Entity
public class Account implements Serializable {
@EmbeddedId
private AccountPK id;
}
我没有太多直接在嵌入式id组件中放置关联的经验,因为JPA不支持这种方式,但它是特定于Hibernate的 作为替代方案,我的建议是使用JPA wikibook部分中描述的方法: (…)JPA1.0要求所有
@Id
映射应该是Basic
映射,因此如果
您的Id来自外键
通过一个OneToOne
或
manytone
映射,您还必须
为应用程序定义基本的@Id映射
外键列。原因
这部分是因为Id必须是
用于标识和缓存的简单对象
用于IdClass
或者EntityManager
find()
API
因为您现在有两个
必须使用相同的外键列
定义要写入的对象
数据库(必须是基本数据库)
1),因此OneToOne
或ManyToOne
外键必须定义为
只读。这是通过
设置JoinColumn
属性
insertable
和updateable
为false,
或者使用
@PrimaryKeyJoinColumn
而不是
@JoinColumn
有两个映射的副作用
对于同一列,您现在的
必须使两者保持同步。这是
通常通过设置
OneToOne
属性的方法
还将基本属性值设置为
目标对象的id。这可以
如果目标
对象的主键是
GeneratedValue
,在本例中
必须确保目标对象的
在关联之前已分配id
这两个对象
(……)
示例ManyToOne
id注释
...
@Entity
@IdClass(PhonePK.class)
public class Phone {
@Id
@Column(name="OWNER_ID")
private long ownerId;
@Id
private String type;
@ManyToOne
@PrimaryKeyJoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
private Employee owner;
...
public void setOwner(Employee owner) {
this.owner = owner;
this.ownerId = owner.getId();
}
...
}
这看起来就像是你要找的(也许不那么复杂)。我会尝试(以增量方式)实现此解决方案。什么?这毫无意义。什么是身份证?如果一个关联只包含一个整数,如何将两个事物映射到该关联?如果你说的是指针,java没有指针。第二段很混乱。什么是嵌入式Id。。。我可以继续。@Leo可能这对你没有任何意义,因为你只是不知道Hibernate/JPA@Jon请显示你的注释实体(即使它不起作用)。@Pascal我已经添加了代码的相关部分。我已经尝试过在JoinTable注释中添加“insertable=false,updateable=false”的几种变体。
@Embeddable
public class AccountEventPK implements Serializable {
@ManyToOne(optional=false)
@JoinColumns({
@JoinColumn(name="association_id", referencedColumnName="association_id"),
@JoinColumn(name="account_number", referencedColumnName="number")
})
private Account account;
@ManyToOne(optional=false)
@JoinColumns({
@JoinColumn(name="association_id", referencedColumnName="association_id"),
@JoinColumn(name="transaction_number", referencedColumnName="number")
})
private Transaction transaction;
}
@Entity
public class Account implements Serializable {
@EmbeddedId
private AccountPK id;
}
...
@Entity
@IdClass(PhonePK.class)
public class Phone {
@Id
@Column(name="OWNER_ID")
private long ownerId;
@Id
private String type;
@ManyToOne
@PrimaryKeyJoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID")
private Employee owner;
...
public void setOwner(Employee owner) {
this.owner = owner;
this.ownerId = owner.getId();
}
...
}