问题描述
应用实例环境:Spring jpa hibernate3
常用数据库表的删除办法,一般都会在DAO类中提供delete.如下例:
public class UnitDAO implements IUnitDAO {
private EntityManager entityManager;
@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
private EntityManager getEntityManager() {
return this.entityManager;
}
public void delete(Unit persistentInstance) {
try {
getEntityManager().remove(persistentInstance);
} catch (RuntimeException re) {
throw re;
}
}
public List<Unit> findAll() {
try {
String queryString = "select model from Unit model";
return getEntityManager().createQuery(queryString).getResultList();
} catch (RuntimeException re) {
throw re;
}
}
}
看上去,没有任何问题,这也是在MyEclipse中自动产生的代码。但是,在实际运行过程中,界面会调用findAll()获得全部的unit记录显示在界面层,根据业务需求,用户选择一个unit进行删除,当调用delete方法时,出现异常:
java.lang.IllegalArgumentException: Removing a detached instance com.gotop.rbac.model.Unit#1
意思就是说,在删除一个detached instance出错。
解决办法:
看看Hibernate是如何处理对象的.Chapter 10. Working with objects. http://www.hibernate.org/hib_docs/reference/en/html/objectstate.html
说的很清楚。Hibernate object states有三种状态:Transient、Persistent、Detached。关于Detached,是这么说的:
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.
一个detached instance是一个已经持久化的对象,但是它的Session已经关闭了,它的引用依然有效,当然,detached instance可能被修改。detached instance能够在以后可以重新附属到一个新的Session,使之能重新序列化。
好了,找到解决办法了,在删除之前把这个Detached instance绑定到当前的Sesssion,在用当前Sesssion删除此instance。getEntityManager()提供merge方法实现。
修改后的delete代码:
public void delete(Unit persistentInstance) {
try {
getEntityManager().remove(getEntityManager().merge(persistentInstance));
} catch (RuntimeException re) {
throw re;
}
}
千万不要写成:
try {
getEntityManager().merge(persistentInstance);
getEntityManager().remove(persistentInstance);
}
执行完merge后persistentInstance还是detached, merge后返回的新对象才是允许删除的。
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javashl/2007123/89631.html)
分享到:
相关推荐
主要介绍了详解git submodule HEAD detached 的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
How'd I get this detached HEAD?Don't git blame me I'm innocent!Has anybody seen my code?So if you run into a beautiful commitThat's code complete with a testing suiteBetcha life that isn't it!But that...
要安装,请在命令行中输入以下命令: npm install is-dom-detached输入ES模块: import isDetachedNode from 'is-dom-detached' ; CommonJS模块: const isDetachedNode = require ( 'is-dom-detached' ) ;用法...
Mac的Sublime Text配置这是我的Mac版Sublime Text 3配置。 添加Vim行为的显着变化: 复古(Vim)已开启Vim边栏导航Vim“ jj”用于退出编辑模式Vim“ alt-j”和“ alt-k”用于上一页和下一页使用剪贴板进行Vim剪切/...
安装包: npm install --save jqueryui-detached-1.11用法这个想法是将这个模块与jquery-detached结合使用。 例如: var $ = require ( 'jquery-detached-2.1.4' ) . newJQuery ( ) ; var jqueryui = require ( '...
与.Net Fiddle中的Detached一起玩! 附加匿名对象图: 导入JSON图: 分离映射器 它是什么 嗨!我正在尝试构建一个快速的,面向对象的映射器,以简化将不连贯的实体保存在Web服务中的任务。 它受到 , 和其他很棒的...
独立的 无框架框架 入门 分离使事情尽可能简单。 只需抓住一些分离的工具: 由用♡
npm install --save typeahead-detached-0.11 用法 这个想法是这个模块将与 jquery-detached 结合使用。 例如: var $ = require ( 'jquery-detached-2.1.4' ) . newJQuery ( ) ; var typeahead = require ( '...
离散涡元法(涡方法)是将局部有旋区的连续分布的涡量用有限个离散的旋涡来代替,通过计算离散旋涡的相互作用和演化实现对整个流场的数值模拟。
Watch only detached 是 ZNC 的一个模块,它通过仅在用户与 bouncer 断开连接时扫描关键字来修改包含的 watch 模块的行为。先决条件为了使用它,您必须安装 ZNC IRC 摇杆。 您可以从或。安装下载源文件。 通过运行...
其他版本的chromedriver如果找到,可以邮件我(nameamtf@qq.com),切记邮件主题必须...Resolved issue 1194: unknown error: cannot determine loading status from disconnected: received Inspector.detached event [[]]
sculpt_detached 通过顶点组雕刻分离区域
9.5 冷知识 断头(detached HEAD)是怎么一回事?第 10 章:远端共同协作 - 使用 GitHub 10.1 GitHub 是什么? 10.2 Push 上传到 GitHub 10.3 Pull 下载更新 10.4 状况题 怎么有时候推不上去... 10.5 从伺服器上...
rabbitmq-server-generic-unix-3.5.1
从3GPP协议和UE端行为分析5G gmm cause #10的网络问题
模组现代.net应用程序(以及.net框架本身的一部分)依赖于依赖项注入,这是一件好事。随着项目的发展,越来越多的服务,业务逻辑服务,存储库服务,与框架相关的或与硬件相关的服务等。在某些时候,一切都是一种服务...
主要介绍了vue生命周期与钩子函数,结合简单实例形式分析了vue.js生命周期及钩子函数相关流程与实现技巧,需要的朋友可以参考下
git命令 总结
在障碍之外思考。 拥抱(有时)解耦的建筑 关于Drupal Camp Baltimore 2015的独立Drupal(和注释)的演示。此回购包含一个完整的安装文件,该文件提供了angular.js应用,可从Pantheon上无头Drupal DEV衍生工具中获取...
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit ./sbin/rabbitmq-server -detached RABBITMQ_NODE_PORT=5673 RABBITMQ_NODENAME=rabbit_1 ./sbin/rabbitmq-server -detached RABBITMQ_NODE_PORT=5674 RABBITMQ_...