1

考虑一个假设的场景,hibernate 有没有办法使持久实体瞬态但同时不删除数据库中的行? session.delete()会使其暂时化,但同时会为数据库发出删除 SQL。

        //Persistant context started... 
        Session session2 = HibernateUtils.sessionFactory.openSession();
        session2.beginTransaction();

        Admin admin = (Admin) session2.load(Admin.class, 1L);
        session2.delete(admin);

        session2.getTransaction().commit();
        session2.close();
        //Persistant context ended...
        ...
        //admin now is transient but the row has been deleted, can we stop this?
4

1 回答 1

0

不,但是,您可以使用session.evict()http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/Session.html#evict(java.lang.Object))使对象分离。如果您随后将主键设置为 0(或其他任何值),您将获得一个有效的瞬态对象,其中包含原始字段的完整副本。因此,您可以执行以下操作:

Foo foo = session.get(Foo.class, 1L);
session.evict(foo);
foo.setID(0L);
foo.setName("copy of original foo");
session.save(foo);

您将获得一份带有新名称的 foo 副本。

(在涉及关联和级联时要小心。)

于 2013-06-18T20:07:52.280 回答