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
Jpa EJB3实体多列同一对象引用问题_Jpa_Entity_Ejb 3.0 - Fatal编程技术网

Jpa EJB3实体多列同一对象引用问题

Jpa EJB3实体多列同一对象引用问题,jpa,entity,ejb-3.0,Jpa,Entity,Ejb 3.0,我有一个实体A,它有3个属性,引用了另一个实体B。 从关系角度来看,这很好,因为我可能有表B中的3个不同id存储为表a中的不同列。为了进一步说明,我的表a有3列,分别称为经理id、主管id、工人id。所有三列都引用了员工表(表B)。 但在JPA中,当实体管理器构建实体A(对应于表A)时,如果三列中有一列以上具有相同的id,则实体A将不具有实体B的单个对象,而是指向相同的引用。(例如,如果经理id和主管id为“12345”,则在构建实体A时,映射到经理id和主管id的字段将指向id为“12345”

我有一个实体A,它有3个属性,引用了另一个实体B。 从关系角度来看,这很好,因为我可能有表B中的3个不同id存储为表a中的不同列。为了进一步说明,我的表a有3列,分别称为经理id、主管id、工人id。所有三列都引用了员工表(表B)。 但在JPA中,当实体管理器构建实体A(对应于表A)时,如果三列中有一列以上具有相同的id,则实体A将不具有实体B的单个对象,而是指向相同的引用。(例如,如果经理id和主管id为“12345”,则在构建实体A时,映射到经理id和主管id的字段将指向id为“12345”的实体B的同一引用对象

这在提交之前是可以的。每当我更改manager_id tp“67891”时,主管id也会与此id一起存储,因为它们指向相同的引用。 这是错误的。 我如何配置框架来获取每个属性的单个引用对象,而不管它们是否指向同一个对象,或者指定实体管理器仅保留已更改的字段? 我不想为此编写本机查询


任何建议都将不胜感激!

如果数据库表的manager\u id和supervisor\u 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);
要查看完整、独立的示例,请参阅:


请向我们展示运行“每当我更改manager_id tp'67891'”的代码。我怀疑这是这个问题的关键部分。我同意指向同一对象的两列。但是,如果我执行a.setManager()有了一个新的、不同的对象和持久化实体a,那么经理、主管和工作人员现在都有了新的值。这就是问题所在。我已经编写了一个小演示-请参阅链接末尾的代码。它按照我的预期工作,但我看不到您描述的问题。我使用OpenJPA作为提供程序。可能您的p中遇到了错误rovider,但我怀疑更可能是您自己的代码中有错误,我担心。这是一个错误。就在钱上。很抱歉浪费您的时间。不过,感谢您的帮助!