Java 在hibernate中使用共享外键列映射两个实体

Java 在hibernate中使用共享外键列映射两个实体,java,hibernate,hibernate-annotations,Java,Hibernate,Hibernate Annotations,我有四个实体要映射在一起,“关联”、“帐户”、“交易”和“TransactionEvent”。关联的id是一个简单的整数id。帐户和事务的每个id都包含一个映射到关联和一个数字的嵌入式id TransactionEvent应该有一个由一个帐户和一个关联组成的嵌入式id。现在,每一个都映射到一个关联,我希望它对于一个TransactionEvent是相同的关联 JPA注释用于Hibernate映射,但我无法做到这一点。我曾尝试为关联键强制使用相同的列名,但Hibernate抱怨列重复 这是可能解决

我有四个实体要映射在一起,“关联”、“帐户”、“交易”和“TransactionEvent”。关联的id是一个简单的整数id。帐户和事务的每个id都包含一个映射到关联和一个数字的嵌入式id

TransactionEvent应该有一个由一个帐户和一个关联组成的嵌入式id。现在,每一个都映射到一个关联,我希望它对于一个TransactionEvent是相同的关联

JPA注释用于Hibernate映射,但我无法做到这一点。我曾尝试为关联键强制使用相同的列名,但Hibernate抱怨列重复

这是可能解决的,还是我没有思考清楚

下面是带注释的类,但我删除了getter/setter和非id列,即javax.persistence命名空间中的注释:


@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();
    }
    ...
}