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 не позаботится об этом для меня, но продолжит копать.