0

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

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

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @Join(name = "idOne")
    One one;
}

@Entity
public class One {
    @Id
    String id;
}

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

我找到了这篇博文,但它与 Hibernate 一起使用,我认为它仍然使用连接表:

@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对象中的外键。

4

2 回答 2

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。再简单不过了

于 2012-11-16T08:43:41.713 回答
1

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

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

@Entity
public class Many {
    @Id
    String id;

    @ManyToOne
    @JoinColumn(name = "foreignKeyColumn")
    One one;
}
于 2012-11-08T11:27:13.310 回答