Hibernate каскадное слияние с непостоянными объектами

У меня есть следующая структура в моем проекте:

public class A {
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.PERSIST,
        org.hibernate.annotations.CascadeType.REFRESH, org.hibernate.annotations.CascadeType.MERGE})
    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id")
    private List<B> bs;
}

public class B {
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "b_id")
    private C c;
}

public class C {
    @ManyToMany(fetch = FetchType.EAGER, targetEntity = TjenesteFraIN.class,
        cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinTable(name = "c_d",
        joinColumns = @JoinColumn(name = "c_id"),
        inverseJoinColumns = @JoinColumn(name = "d_id"))
    private List<D> ds;
}

public class D {
    ...
}

Затем сценарий, где у меня есть отдельный A-объект со ссылкой на отдельный B-объект, который, в свою очередь, имеет ссылку на отдельный C-объект, который имеет ссылки на пару D-объектов. (Я использую JMS, поэтому они действительно отстранены). Как это:

final A a = getA(123); //load A-object from database
final C c = a.getSpecialC();

c.addD(getD(1)); //get Ds from database
c.addD(getD(2));

//Serialize A and send JMS-call to store the A

//On the other side, deserialize A, and then call

public A mergeA(final A a) {
    return getSession(false).merge(a);
}

Теперь отсоединенный A будет объединен с представлением базы данных A, то же самое для B и C, но что произойдет с новыми ссылками от C до D? Я вижу на практике, что это не работает, ничего не хранится в таблице соединений c_d, но я не понимаю, почему. Это из-за ограничений в Hibernate/JPA, или я что-то упустил в отношении моей конфигурации?

Обновить:

Используя отладчик, я смог явным образом получить getSession(). Merge() для C-объекта, а затем его ссылки на D были сохранены в базе данных. До сих пор не совсем понятно, почему каскад Hibernate не позаботится об этом для меня, но продолжит копать.

0 ответов

Другие вопросы по тегам