Eclipselink вставляет объединенный объект с помощью @OneToOne - PullRequest
0 голосов
/ 07 марта 2012

У меня есть два объекта: 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?

...