一、问题描述
在jpaBaseDao做remove对象的时候使用 em.remove(t)会爆出下面的错误。
二、问题分析
em调用remove时,Hibernate仍然还处于“detach”状态,在Hibernate文档中关于detach叙述:
Detached - a detached instance is an object that has been persistent, but its Session has been closed. The reference to the object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be reattached to a new Session at a later point in time, making it (and all the modifications) persistent again.
此时对象已经存在于数据库,不存在与java内存的heap区,对象不处于em的管理范围,Session已经关闭,但引用仍然存在(换句话说,heap里的对象没有了)。所以此时必须再次产生一个Session(在heap里产生对象);
三、解决办法
在remove之前先使用em.merge()方式保持session和对象一致。
em.remove(em.merge)