1

我想使用休眠从数据库中获取一个实体,复制它,删除它与休眠的所有链接,然后,如果需要,保留副本。最后,原件和副本都在数据库中。

我的实体有很多子实体、孙子实体等等。其中一些甚至可能在集合中。

副本必须是深度递归副本,即子项也必须被复制并放入新对象中。

我正在使用 beanLib,它正在正确复制实体。Persistend bads 变成了 Array 列表,我检查了孩子们,看看它们是否与原始对象不同。这是我的代码:

Session sess = getDbSession();      
Dossier doss = (Dossier) sess.createCriteria(Dossier.class)
                             .add(Restrictions.eq("id", 1249))
                             .uniqueResult();

Hibernate3BeanReplicator rep = new Hibernate3BeanReplicator();
rep.initPropertyFilter(new MyBeanLibPropertyFilter()); // filters ids. works correctly

Dossier doss2 = rep.copy(doss, Dossier.class);

我有两个问题:

1-副本的其中一个子项的值设置为 null。它们nullable=false在休眠注释中,我已经检查过了,它们在原始注释中有值。该字段的类型是Double(不知道是否相关)。解决了!Getter 和 setter 没有按照命名约定命名。

2-使用session.persist(doss2)不会持久化对象。我什至试图关闭会话然后再次打开它,但没有成功。解决了!失踪tx.commit();

所以如果阻止我回答我自己的问题。如果可以,我会发布答案。

我究竟做错了什么?

编辑:提交代码:

Transaction tx = null;
try {
    tx = sess.beginTransaction();
    sess.save(doss2);
    tx.commit();
    sess.flush();
} catch (Exception e) {
    if (tx != null) {
        tx.rollback();
    }
    throw e;
}   
4

0 回答 0