DataNucleus中的多对一单向关系

时间:2012-11-08 11:01:13

标签: java jpa jdo datanucleus many-to-one

对于上下文,客户端我使用MVP模式,因此带有One列表的视图只知道ID,当我在服务器上收到新的Many时,我想要能够只使用" setOneId"更新One的外键。或者ID为设置为所需值的空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,只需使用{{1}中的良好ID更新idOne即可对象。

我发现了这个blogpost,但它与Hibernate有关,我认为它仍然使用连接表:

Many

我试过了,但我得到了this error

我不明白我是如何挣扎的。我的目标是建立一个表格,保留一些参考数据(如国家列表@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对象中的外键。

2 个答案:

答案 0 :(得分:1)

如果它是一个单向关联,并且Many是拥有方(根据你的第二个例子),那么你正走向错误的方向。委托更新并在单向关系的拥有方插入责任没有多大意义(与insertable = false和updateable = false一样)。

编辑:更新的答案 所以你想要的是多对一的,拥有一个外键列。试试这个

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @JoinColumn(name = "foreignKeyColumn")
    One one;
}

答案 1 :(得分:1)

@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。不能简化