我有两个对象:A带主键A_ID,B带主键B_ID。 B具有A_ID的外键。在数据库级别,这意味着您可以将多个B对象指向同一个A,该关系实际上是一个A到一个B.A_ID和B_ID都是由序列生成的。我有以下EclipseLink注释来描述这种关系:
public class A {
...
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = B.class)
public B getB();
...
}
public class B {
...
@OneToOne(fetch = FetchType.LAZY, targetEntity = A.class)
@JoinColumn(name = "A_ID")
public A getA();
...
}
这不起作用。如果我有一个A对象,其上设置了B对象,并且该B对象上有相同的A对象集,那么B对象不会被插入,所以当我然后执行A.getB()时它是null 。但是,如果我将A上的注释更改为@OneToMany,如下所示:
public class A {
...
@OneToMany(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = B.class)
public Set<B> getB();
...
}
与其他所有相同,它现在插入B,但没有A_ID设置链接回A对象。合并逻辑(对于两种情况)归结为:
public void merge(A objA, B objB) {
objA.setB(objB);
objB.setA(objA);
entitymanager.merge(objA);
}
我之前曾问过this question这两个对象共享相同ID的情况。除了共享ID(导致@MapsId注释)之外,该问题的唯一区别在于B对象也有cascade = CascadeType.ALL
作为注释的一部分,但我在这种情况下尝试过,但它仍然失败。有没有人知道如何使用单独的ID为B对象使用@OneToOne来使用这个案例?