繁体   English   中英

DataNucleus中的多对一单向关系

[英]Many-to-one unidirectional relation in DataNucleus

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

所以我尝试在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

我找到了这个博文 ,但它是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对象中的外键。

如果它是单向关联,并且Many是拥有方(根据你的第二个例子),你正走向错误的方向。 委托更新并在单向关系的拥有方插入责任没有多大意义(与insertable = false和updateable = 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。不能简单

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM