考虑一个假设的场景,是否有一种方法在休眠中使持久实体瞬态但同时不删除数据库中的行?
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?
答案 0 :(得分: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副本。
(当涉及关联和级联时,请小心这样做。)