У меня есть два объекта: A с первичным ключом A_ID и B с первичным ключом B_ID.У B есть внешний ключ к A_ID.В то время как на уровне базы данных это означает, что вы можете иметь несколько объектов B, указывающих на один и тот же 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 (), он становится нулевым,Однако, если я поменяю аннотацию на 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);
}
. Ранее я задавал этот вопрос , когда оба объекта имеют один и тот же идентификатор.Единственное отличие в этом вопросе, кроме общего идентификатора (который приводит к аннотации @MapsId), состоит в том, что объект B также имеет cascade = CascadeType.ALL
как часть аннотации, но я попробовал это в этом сценарии, и он все еще не работает.Кто-нибудь знает, как получить этот случай с отдельным идентификатором для объекта B для работы с использованием @OneToOne?