是否可以对 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
这种重复映射是不可能的,因为它可能导致冲突。如果将该address字段设置为 ID = X 的地址,然后addressId设置为另一个 ID = Y 会怎么样?JPA 在保存时应考虑哪一项?这就是为什么您必须指定它并创建这些字段之一insertable=false, updatable=false。
解决问题的方法就是EntityManager.getReference()方法。它返回给定类和 ID 的“代理”对象,而不实际从数据库加载它。这样您就可以address在Person对象中设置引用并保留它:
em.persist(new Person(em.getReference(Address.class, 1)));
Run Code Online (Sandbox Code Playgroud)
addressId有了这个解决方案,您根本不需要该字段。
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |