我有一个实体A有3个属性引用另一个实体B. 从关系POV来看,这很好,因为我可能将表B中存在3个不同的ID存储为表A中的不同列。为了进一步说明,我的表A有3列名为manager_id,supervisor_id,worker_id。所有三列都引用了一个员工表(表B)。 但是在JPA中,当实体管理器构建实体A(对应于表A)时,如果三列中的多个列具有相同的id,则实体A将不具有实体B的单个对象,但是将指向相同的引用。 (例如,如果manager_id和supervisor_id为'12345',则在构建实体A时,映射到manager_id和supervisor_id的字段将指向实体B的同一参考对象,其id ='12345'
在提交时间之前这是好的。每当我更改manager_id tp'67891'时,supervisor_id也会以此id存储,因为它们指向相同的引用。 这是错的。 如何配置框架以获取每个属性的单个引用对象,无论它们是否指向同一个对象,还是指定实体管理器仅保留已更改的字段? 我不想为此写一个原生查询。
非常感谢任何建议!
答案 0 :(得分:0)
如果数据库表的manager_id和supervisor_id列具有相同的值,则实体中的相应属性将指向同一对象。这是正常的,正确的,JPA行为,并不是您可以或应该避免的事情。
您谈到更改manager_id值。你是怎么做到的?我相信您应该能够更改相应属性引用的对象,并让JPA正确更改数据库中的值。
在代码中:
@Entity
public class A {
@ManyToOne @Column(name="manager_id")
private B manager;
@ManyToOne @Column(name="supervisor_id")
private B supervisor;
@ManyToOne @Column(name="worker_id")
private B worker;
public void setManager(B manager) {
this.manager = manager;
}
}
A a;
B b67891;
a.setManager(b67891);
要查看完整的,自包含的示例,请参阅: