JPA+Hibernate Junit4做批量删除时出错:
批量删除方法如下:
(private EntityManager em)
/**
* 批量删除实体
* 可实体批量删除操作,在一个transaction中完成
* 任何Exception发生,全部更新操作回滚
* @param entityClass 实体类
* @param entityids 实体id数组
*/
public void batchDelete(List<T> entities){
for(int i = 0; i<entities.size(); i++){
em.remove(entities.get(i));
}
}
junit测试出现以下错误:
java.lang.IllegalArgumentException: Removing a detached instance com.agiliti.bean.person.Person#47
..................
原因:
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.
此时,Session已经关闭,但引用仍然存在(换句话说,heap里的对象没有了)。所以此时必须再次产生一个Session(在heap里产生对象):
解决方法之一——在删除之前把这个Detached instance绑定到当前的Sesssion,在用当前Sesssion删除此instance。getEntityManager()提供merge方法实现:
public void batchDelete(List<T> entities){
for(int i = 0; i<entities.size(); i++){
em.remove(em.merge(entities.get(i)));
}
}
请注意:如果写成:
仍然错误写法
public void batchDelete(List<T> entities){
for(int i = 0; i<entities.size(); i++){
em.merge(entities.get(i));
em.remove(entities.get(i));
}
}
原因是执行完merge还是detached, merge后返回的新对象才是允许删除的。
分享到:
相关推荐
标题 "java.lang.NoClassDefFoundError: javax/persistence/EntityListener" 提到的问题是一个常见的Java运行时异常,通常表示在类加载时找不到指定的类定义。这个错误在Java应用程序或Web应用中出现,可能是因为...
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
测试通过,集成了spirng MVC4+data jpa+spring Security pom.xml
【标题】:“仓库管理系统,SpringBoot+Spring Data JPA+……” 这个系统是基于Spring Boot框架构建的一个仓库管理解决方案。Spring Boot是Java生态系统中的一个流行框架,它简化了创建独立的、生产级别的基于...
搭建JPA+Hibernate实例的步骤如下: 1. **添加依赖**:在你的项目中,你需要引入JPA和Hibernate的依赖库。如果你使用的是Maven,可以在pom.xml文件中添加如下依赖: ```xml <groupId>org.hibernate ...
用SpringBoot + Spring Data JPA操作数据库 项目启动的时候 报了一个错 SpringBoot的版本是2.2.6.RELEASE org.springframework.beans.factory.BeanCreationException: Error creating bean with name '...
**JPA(Java Persistence API)和Hibernate是两个在Java编程中用于对象关系映射(ORM)的重要工具。本文将深入探讨这两个技术,并通过一个简单的示例来阐述它们如何协同工作。** **一、JPA简介** Java Persistence ...
【标题】"用maven构建SpringMVC+JPA+Hibernate+Hsql+jetty的web项目"涉及了多个核心的Java Web开发技术,这里我们将深入探讨这些技术以及如何将它们整合到一起。 1. Maven:Maven是Apache的一个开源项目,它是一个...
在IT领域,构建高效、可扩展的Web应用是至关重要的,而"spring+springMVC+jpa+hibernate框架整合"就是一个常见的解决方案。这个整合涉及到四个关键的技术栈:Spring框架、SpringMVC、JPA(Java Persistence API)...
标签:hibernate、javax、persistence、jpa、api、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...
这是整合SpringMVC+Spring+SpringDataJPA+Hibernate简单的实现登录的功能,用的是mysql数据库,这是一个web Project 如果你用的是JavaEE6那么你要注意bean-validator.jar和weld-osgi-bundle.jar与slf4j的jar包冲突。...
总之,"spring3+springmvc+jpa+hibernate多数据源"项目展示了如何在一个复杂的Java Web应用中,利用Spring框架的灵活性和JPA的便利性,高效地管理多个数据库。这样的设置对于处理多样化数据存储需求的企业级应用来说...
【资源介绍】毕设项目:基于springboot+jpa+thymeleaf的网络点餐系统.zip毕设项目:基于springboot+jpa+thymeleaf的网络点餐系统.zip毕设项目:基于springboot+jpa+thymeleaf的网络点餐系统.zip毕设项目:基于...
标签:hibernate、javax、persistence、jpa、api、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...
**JPA(Java Persistence API)**是Java平台上的一个标准,用于管理关系数据库中的数据。它为Java开发者提供了一种对象/关系映射工具来管理Java应用中的关系数据。而**Hibernate**则是一个实现了JPA规范的开源ORM...
Flex 是一个高效、免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用... 本课程主要是讲解Flex 4.6和ActionScript 3.0使用方法和技巧,并结合BlazDS/Spring /JPA/Hibernate等技术实现在线书店的开发过程。
在Spring+Jersey+JPA+Hibernate的组合中,Hibernate作为JPA的具体实现,负责与MySQL数据库之间的交互。 MySQL是一种广泛使用的开源关系型数据库管理系统,因其高性能、可靠性和易于管理而在Web应用中受到青睐。在这...
标题“Spring + JPA + Hibernate配置”涉及到的是Java开发中常用的三个框架——Spring、Java Persistence API (JPA) 和Hibernate的集成与配置。这是一份关于如何将这些框架结合使用的教程或参考资料,可能包含了实现...