JPA,组合@JoinColumn和@Column

Ras*_*nke 6 java jpa

是否可以对 JPA 中的同一字段同时使用 @JoinColumn 和 @Column,从而启用两者的更新?

假设我有一个这样的实体:

@Entity
public class Person{
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    @ManyToOne
    private Address address;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

假设 Address 对象已经存在 - 创建此对象时,我需要在持久保存 Person 之前从数据库中获取地址。这是我在整个应用程序中当前的设计,但它可能会导致性能问题。是否可以添加仅使用 ID 进行持久化的可能性,同时保留对真实对象进行持久化的可能性(因为不必在其他地方更改大量代码)?像这样的东西

@Entity
public class Person{
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    @ManyToOne
    private Address address;

    @Column(name="address_id")
    private Integer addressId;

    // getters and setters
}

em.persist(new Person(1));
em.persist(new Person(getAddress(1)));
Run Code Online (Sandbox Code Playgroud)

是否可以注释以允许这两条持久线?我目前的信念是,其中一个领域需要有insertable = false

Ada*_*yga 3

这种重复映射是不可能的,因为它可能导致冲突。如果将该address字段设置为 ID = X 的地址,然后addressId设置为另一个 ID = Y 会怎么样?JPA 在保存时应考虑哪一项?这就是为什么您必须指定它并创建这些字段之一insertable=false, updatable=false

解决问题的方法就是EntityManager.getReference()方法。它返回给定类和 ID 的“代理”对象,而不实际从数据库加载它。这样您就可以addressPerson对象中设置引用并保留它:

em.persist(new Person(em.getReference(Address.class, 1)));
Run Code Online (Sandbox Code Playgroud)

addressId有了这个解决方案,您根本不需要该字段。