4

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

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

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

    // getters and setters
}

假设 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)));

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

4

1 回答 1

2

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

解决问题的方法是EntityManager.getReference()方法。它为给定的类和 ID 返回一个“代理”对象,而不实际从 DB 加载它。这样您就可以address在对象中设置引用Person并将其持久化:

em.persist(new Person(em.getReference(Address.class, 1)));

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

于 2013-08-01T13:09:23.773 回答