2013-08-01 102 views
2

对于JPA中的同一个字段,是否可以同时使用@JoinColumn和@Column,从而实现更新?JPA,Combine @JoinColumn和@Column

可以说我有一个这样的实体:

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

    // getters and setters 
} 

假设地址对象已经存在 - 创建该对象时,我需要坚持一个人之前,从数据库读取的地址。这是我整个应用程序的当前设计,但它可能会导致性能问题。是否有可能通过仅使用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

我不会真正理解你的尴尬。 Column和JoinColumn都只是定义数据库列名和属性的注释,没有定义关系。我的第一个问题是,这是否有可能一个地址被多于一个人使用?或有一人一个地址,如果两个人住在同一地址的地址获得redudant?无论如何,你应该使用一对多或OneToOne注解来定义你的人,你的地址和之间的关系,当你定义级联只刷新,一个持续存在或对人合并绝不会创建一个地址了。 –

+0

对不起,忘了多对一的注释 –

+0

你的最后一个假设是正确的,其中一个字段必须有'插入= FALSE',(也'更新= FALSE'和'可删除= FALSE'),使现场将只是一个读-只有一个。 –

回答

3

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

一个解决问题的方法是EntityManager.getReference()方法。它为给定的类和ID返回一个“代理”对象,而不实际从数据库加载它。这样,您就可以设置Person对象address参考,并坚持它:

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

由于该解决方案,你不需要addressId场都没有。