Hibernate级联与非持久对象合并

时间:2013-02-11 13:55:16

标签: java hibernate jpa hibernate-cascade

我的项目中有以下结构:

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对象的scenerio,引用了一个分离的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引用到Ds的新内容会发生什么?我在实践中看到它不起作用,没有任何东西存储在c_d连接表中,但我不明白为什么。是因为Hibernate / JPA的限制,还是我遗漏了一些与我的配置有关的东西?

更新

通过使用调试器,我能够在C对象上显式getSession()。merge(),然后它对D的引用存储在数据库中。仍然不太明白为什么Hibernate级联不会为我解决这个问题,但会继续挖掘。

0 个答案:

没有答案