Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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 DataNucleus中的多对一单向关系_Java_Jpa_Jdo_Datanucleus_Many To One - Fatal编程技术网

Java DataNucleus中的多对一单向关系

Java DataNucleus中的多对一单向关系,java,jpa,jdo,datanucleus,many-to-one,Java,Jpa,Jdo,Datanucleus,Many To One,对于上下文,客户端我使用MVP模式,因此带有One列表的视图只知道ID,当服务器上接收到我的新Many时,我希望能够使用一个“setOneId”或一个ID设置为所需值的空One对象来更新One的外键 所以我尝试在DataNucleus中创建一个多对一单向,我有点挣扎。我可以使用JDO或JPA,我真的不在乎。在JPA中,我尝试了以下方法: @实体 公共课很多{ @身份证 字符串id; @许多酮 @加入(name=“idOne”) 一个,; } @实体 公共一级{ @身份证 字符串id; } 这几

对于上下文,客户端我使用MVP模式,因此带有
One
列表的视图只知道ID,当服务器上接收到我的新
Many
时,我希望能够使用一个“setOneId”或一个ID设置为所需值的空
One
对象来更新
One
的外键

所以我尝试在DataNucleus中创建一个多对一单向,我有点挣扎。我可以使用JDO或JPA,我真的不在乎。在JPA中,我尝试了以下方法:

@实体
公共课很多{
@身份证
字符串id;
@许多酮
@加入(name=“idOne”)
一个,;
}
@实体
公共一级{
@身份证
字符串id;
}
这几乎就是我想要的。创建一对多,但使用联接表。我想有个直系亲属。当我插入/更新一个
Many
时,我不想插入/更新相关的
One
,只需在我的
Many
对象中用好的id更新
idOne

我发现了这个,但它是使用Hibernate的,我认为它仍然使用联接表:

@实体
公共课很多{
@身份证
公共字符串id;
@列(name=“idOne”)
私有字符串idOne;
@许多酮
@JoinColumn(name=“idOne”,nullable=false,insertable=false,updateable=false)
私家车;
}
我试过了,但我完全成功了


我不明白我是怎么挣扎的。我的目标是要有一个表来保存一些参考数据(比如国家列表作为类
One
),和一个“工作项”列表(比如城镇作为类
Many
),我创建/更新这些数据时不创建/更新参考数据,而只是将其外键放在
Many
对象中。

如果是单向关联,而
Many
是拥有方(根据您的第二个示例),您正朝着错误的方向前进。将更新和插入责任委托给单向关系的拥有方(如insertable=false和updateable=false)没有多大意义

编辑:更新答案 因此,您需要的是多对一,在拥有端有一个外键列。试试这个

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @JoinColumn(name = "foreignKeyColumn")
    One one;
}
然后,如果将初始对象持久化为

tx.begin();
A a = new A("FirstA");
B b1 = new B("FirstB");
B b2 = new B("SecondB");
a.setB(b1);
em.persist(a);
em.persist(b2);
tx.commit();

... (some time later)
tx.begin();
A a = em.find(A.class, "FirstA");
B b2 = em.getReference(B.class, "SecondB");

// update the B in A to the second one
a.setB(b2);
tx.commit();

这将更新A和B之间的FK。无法更简单地使用
@MoneyToMany
关系。你是说@ManyToMany?假设它是双向的,并且它还使用联接表。在我的例子中,
One
对象不需要知道
Many
。如果您获取您编写的代码,并删除
@Join
,那么在JPA中就可以了。代码生成器将为
Many
生成一个表,该表的列是
One
的外键。我无法识别
@Join
注释,因此我怀疑这就是导致问题的原因。如果您不想要连接表,为什么要放置@Join?DN文档定义了如何放置这些关系,以及您得到了哪些表,JDO或JPAI是否已经阅读了这些文档。在中,没有无联接表的单向示例。在中,据说它的操作与一对一完全相同,但我们尝试了,但没有达到预期效果:它保存了外来项
One
,在保存
Many
时也保存了外来项。我会修改我的问题来添加更多的测试。我试图说清楚,显然我不是太糟糕。我不想要联接表,我想要在我拥有的对象上有一个外键。当我更新拥有的对象时,我不想更新拥有的对象,我只想更新外键。很抱歉,无论如何,我更新了我的答案:)我们尝试过,如果我没有弄错的话,问题是DataNucleus在保存
多个
时会保存
一个
。我们在OpenJPA中进行了尝试,但效果不错。我仍然希望找到DataNucleus的解决方案,也许这是一个bug,他们的跟踪器上必须存在一个问题……从这个页面上看,似乎DataNucleus默认级联更新。尝试显式关闭层叠更新。
tx.begin();
A a = new A("FirstA");
B b1 = new B("FirstB");
B b2 = new B("SecondB");
a.setB(b1);
em.persist(a);
em.persist(b2);
tx.commit();

... (some time later)
tx.begin();
A a = em.find(A.class, "FirstA");
B b2 = em.getReference(B.class, "SecondB");

// update the B in A to the second one
a.setB(b2);
tx.commit();