Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA,将@JoinColumn和@Column组合起来_Java_Jpa - Fatal编程技术网

Java JPA,将@JoinColumn和@Column组合起来

Java JPA,将@JoinColumn和@Column组合起来,java,jpa,Java,Jpa,是否可以对JPA中的同一字段同时使用@JoinColumn和@Column,从而启用这两个字段的更新 假设我有这样一个实体: @Entity public class Person{ @JoinColumn(name = "address_id", referencedColumnName = "id") @ManyToOne private Address address; // getters and setters } 假设Address对象已经存在-创

是否可以对JPA中的同一字段同时使用@JoinColumn和@Column,从而启用这两个字段的更新

假设我有这样一个实体:

@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

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

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

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

由于此解决方案,您根本不需要
addressId
字段。

我不太理解您的问题。Column和JoinColumn都是定义数据库列名和属性的唯一注释,它不定义任何关系。我的第一个问题是,一个地址有可能被不止一个人使用吗?或者一个人有一个地址,如果两个人住在同一个地址,地址就会被删除?无论如何,您应该使用OneToMany或OneToOne注释来定义您的联系人和地址之间的关系,并且当您将级联定义为仅刷新时,对联系人的持久化或合并也不会创建地址。对不起,忘记了多通注释您上一个假设是正确的,其中一个字段必须具有
insertable=false
,(以及
updateable=false
deletable=false
)以便该字段仅为只读字段。