是否可以将@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
答案 0 :(得分:3)
这种重复映射是不可能的,因为它可能导致冲突。如果您将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
字段。