Datanucleus中的多对一单向关系



对于上下文,客户端我使用MVP模式,因此带有One列表的视图仅知道ID,当在服务器上收到我的新Many时,我想只需使用" setOneId"或一个空的 One对象更新One的外键。

因此,我尝试在Datanucleus中创建一个多一单向的单向,我正在努力。我可以使用JDO或JPA,我真的不在乎。在JPA中,我尝试了此:

@Entity
public class Many {
    @Id
    String id;
    @ManyToOne
    @Join(name = "idOne")
    One one;
}
@Entity
public class One {
    @Id
    String id;
}

这几乎是我想要的。创建了一对多的,但带有一个联接表。我想有一个直接关系。当我插入/更新Many时,我不想插入/更新相关的One,只需在我的Many对象中使用良好ID更新idOne

我找到了这个博客文章,但它与冬眠有关,我认为它仍然使用一个加入表:

@Entity
public class Many {
    @Id
    public String id;
    @Column(name="idOne")
    private String idOne;
    @ManyToOne
    @JoinColumn(name="idOne", nullable=false, insertable=false, updatable=false)
    private One one;
}

我尝试过,但是我得到了这个错误。

我不明白我是如何挣扎的。我的目标是拥有一个保留一些参考数据的表(例如One类列表),以及"工作项目"列表(例如城镇为Many类),我在没有创建/更新的情况下创建/更新参考数据,仅在Many对象中的外键。

如果其单向关联,而 Many是自有的一侧(按照您的第二个示例),则朝错误的方向前进。将更新和插入单向关系的拥有端委托并插入责任并没有多大意义(如插入= false = false和更新= false所做的那样)。

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

@Entity
public class Many {
    @Id
    String id;
    @ManyToOne
    @JoinColumn(name = "foreignKeyColumn")
    One one;
}
@Entity
public class A {
    @Id
    String id;
    @OneToOne(cascade=CascadeType.ALL)
    B b;
}
@Entity
public class B {
    @Id
    String id;
}

,然后如果您将初始对象持续为

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。无法更简单