JPA,结合@JoinColumn和@Column

时间:2013-08-01 12:54:51

标签: java jpa

是否可以将@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

1 个答案:

答案 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字段。