69. JPA实体Bean的生命周期【从零开始学Spring Boot】
【从零开始学习Spirng Boot—常见异常汇总】
在使用JPA的时候,如果对bean的生命周期不了解的话,难免会碰到一些问题,比如:InvalidDataAccessApiUsageException: Removing a detached instance 。
那么这一小节说说实体Bean的生命周期。
1、实体Bean生命周期的4种状态
实体分为被容器管理和不被容器管理两种。可以通过实体管理器的的两个方法进行检测:
contains()用来检查实体是否被管理。
clear()分离实体。
实际上,实体共有4种状态。
new—新实体(新生态):实体由应用产生和实体管理器没有任何联系,也没有唯一的标识符。
managed—持久化实体(或者托管实体) (持久态):新实体和实体管理器产生关联(通过persist()、merge()等方法),在实体管理器中存在和被管理,标志是在实体管理器中有一个唯一的标志。
detached—分离的实体(游离态):实体有唯一的标识,但它的标识不被实体管理器管理。
removed—删除的实体(删除状态):实体被remove()方法删除,对应的记录将会在当前事务提交的时候从数据库中删除。
下面根据调用的方法说说各种状态的转换:
2、状态转换
(1). persist(T entity)
调用persist,新实体状态(new)转化为持久化状态(managed),如果实体已经被持久化,则调用persist方法不会发生任何事情,如果对于一个删除状态的调用persist方法,则删除状态的实体又转变为持久化状态,如果对于一个游离状态(detached)的实体执行persist操作,则抛出IllegalArgumentException异常。
(2). remove(T entity)
通过调用remove方法删除一个持久化的实体,如果实体声明为级联删除,则相关联的实体也被删除。
在一个新实体状态(new)的实体上调用remove操作,将被忽略。(这个是不会抛出任何异常信息的,还有就是这里一定要区分是新生态(new)还是游离态(detached) )。
在游离态的实体上调用remove操作,将抛出IllegalArgumentException异常。
在删除态的实体上调用remove操作,将被忽略。
(3). merge(T entity)
将游离态的实体持久化到数据库中,并转换为持久化状态。
如果A是一个游离态的实体,该方法会将A的修改提交到数据库中,并产生一个managd态的实例A2。
如果A是一个new态的实体,该方法会根据A产生一个managed态的实例A2。
如果是A是一个managed态的实体,它的状态不会改变,但是系统仍然会在数据库中执行update操作。
如果A是remove态的实体,该方法会抛出IllegalArgumentException异常。
(3). 实例理解状态
如果只看理论理解的话,我觉得还是有点不深刻,看看代码:
DemoInfo demoInfo = new DemoInfo();
demoInfo.setName("demoInfo");
以上的这个代码的实体对象状态是 新生态(new)。
如果你修改为如下代码就可不一样了:
DemoInfo demoInfo = new DemoInfo();
demoInfo.setId(1);
demoInfo.setName("demoInfo");
以上代码实体对象状态是 游离态(detached)
在看如下代码:
publicvoid testSave(){
DemoInfo demoInfo = new DemoInfo();
demoInfo.setName("demoInfo");
demoInfoDao.save(demoInfo);
System.out.println(demoInfo);
}
具体的 demoInfoDao.save(demoInfo)代码:
@Transactional
publicvoid save(Object entity){
entityManager.persist(entity);
}
我们分析这个demoInfo的一个状态情况,首先从testSave开始之后new了一个对象出来,然后设置了一些基本信息,在 demoInfoDao.save(demoInfo)之前这个时候,demoInfo处于新生态(new),然后进入到了具体的save(Object entity)方法,在
entityManager.persist(entity)这个方法之前,demoInfo仍然是处于新生态(new),当执行entityManager.persist(entity)这个方法之后,demoInfo此时demoInfo就处于持久状态(managed),然后save方法执行完毕,返回到testSave()方法继续往下执行,此时的demoInfo就是游离状态(detached)了,此时的游离对象在执行remove方法是抛出异常的 InvalidDataAccessApiUsageException:Removing a detached instance com.kfit.demo.bean.DemoInfo。
61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】
60. Spring Boot写后感【从零开始学Spring Boot】
59. Spring Boot Validator校验【从零开始学Spring Boot】
58. Spring Boot国际化(i18n)【从零开始学Spring Boot】
57. Spring 自定义properties升级篇【从零开始学Spring Boot】
56. spring boot中使用@Async实现异步调用【从零开始学Spring Boot】
55. spring boot 服务配置和部署【从零开始学Spring Boot】
54. spring boot日志升级篇—logback【从零开始学Spring Boot】
52. spring boot日志升级篇—log4j多环境不同日志级别的控制【从零开始学Spring Boot】
51. spring boot属性文件之多环境配置【从零开始学Spring Boot】
50. Spring Boot日志升级篇—log4j【从零开始学Spring Boot】
49. spring boot日志升级篇—理论【从零开始学Spring Boot】
48. spring boot单元测试restfull API【从零开始学Spring Boot】
47. Spring Boot发送邮件【从零开始学Spring Boot】
46. Spring Boot中使用AOP统一处理Web请求日志
45. Spring Boot MyBatis连接Mysql数据库【从零开始学Spring Boot】
44. Spring Boot日志记录SLF4J【从零开始学Spring Boot】
43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
42. Spring Boot多数据源【从零开始学Spring Boot】
41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
40. springboot + devtools(热部署)【从零开始学Spring Boot】
39.4 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.3 Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】
39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】
38 Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
37 Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】
36 Spring Boot Cache理论篇【从零开始学Spring Boot】
35 Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
34Spring Boot的启动器Starter详解【从零开始学Spring Boot】
33 Spring Boot 监控和管理生产环境【从零开始学Spring Boot】
69. JPA实体Bean的生命周期【从零开始学Spring Boot】的更多相关文章
- 74. Spring Data JPA方法定义规范【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 事情的起因:有人问过我们这个这个问题:为什么我利用Spring data jpa写的方法没有按照我想要的情况进行执行呢?我记得当时只是告诉他你你先 ...
- 64.JPA命名策略【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在(39.2). Spring Boot Shiro权限管理[从零开始学Spring Boot] 这一章节中有人碰到这样一个问题"导入的 ...
- 63.JPA/Hibernate/Spring Data概念【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 事情的起源,无意当中在一个群里看到这么一句描述:"有人么?默默的问一句,现在开发用mybatis还是hibernate还是jpa&quo ...
- (8). 使用JPA保存数据【从零开始学Spring Boot】
在看这一篇文档的话,需要先配置好JPA – Hibernate. 总体步骤: (1) 创建实体类Demo,如果已经存在,可以忽略. (2) 创建jpa repository类操作持久化. (3 ...
- (7)JPA - Hibernate【从零开始学Spring Boot】
在说具体如何在spring boot 使用Hibernate前,先抛装引玉些知识点?什么是JPA呢? JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象- ...
- 17、Spring Boot普通类调用bean【从零开始学Spring Boot】
转载:http://blog.csdn.net/linxingliang/article/details/52013017 我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个 ...
- 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean 就是我们定义的bean无法进行注入,那到底是什 ...
- (41)Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】
已经好久没有讲一些基础的知识了,这一小节来点简单的,这也是为下节的在Spring Boot中使用多数据源做准备. 从Spring 3.0开始,增加了一种新的途径来配置Bean Definition,这 ...
- (17)Spring Boot普通类调用bean【从零开始学Spring Boot】
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
随机推荐
- 498 Diagonal Traverse 对角线遍历
详见:https://leetcode.com/problems/diagonal-traverse/description/ C++: class Solution { public: vector ...
- vs2013转为vs2010项目
1.首先用记事本之类的工具打开.sln文件 打开后会看到如下信息 Format Version 12.00 就是指VS2013 VisualStudioVersion = 12.0.21005.1 指 ...
- AJPFX关于枚举,泛型详解
枚举类型是JDK5.0的新特征.Sun引进了一个全新的关键字enum来定义一个枚举类.下面就是一个典型枚举类型的定义:public enum Color{RED,BLUE,BLACK,YELLOW,G ...
- canvas基础绘制-绚丽时钟
效果图: 与canvas基础绘制-绚丽倒计时的代码差异: // var endTime = new Date();//const声明变量,不可修改,必须声明时赋值: // endTime.setTim ...
- Java 11 正式发布,支持期限至2026年9月
美国当地时间9月25日,Oracle 官方宣布 Java 11 (18.9 LTS) 正式发布,可在生产环境中使用!这是自 Java 8 后的首个长期支持版本,非常值得大家的关注,可以通过下面的地址进 ...
- Android小玩意儿-- 从头开发一个正经的MusicPlayer(三)
MusicService已经能够接收广播,通过广播接收的内容来做出相应的MediaPlayer对象的处理,包括播放,暂停,停止等,并当MediaPlayer对象的生命周期发生变化的时候,同样通过发送广 ...
- DDR SDRAM
DDR SDRAM(Double Data Rate SDRAM)是一种高速CMOS.动态随机访问存储器, 它采用双倍数据速率结构来完成高速操作.应用在高速信号处理系统中, 需要缓存高速.大量的数据的 ...
- 离开APM的弹性云还是真弹性吗
准确来说应该叫脱离业务的弹性云或者容器都是伪弹性.之所以标题中有APM一是因为它近来热门,二是因为它在我将要说的这个事情上起到关键性的作用. 不管是亚马逊的弹性云.容器方案或者国内众多云厂商在自动伸缩 ...
- UI常用字体定义和继承的实例,ResearchKitCode
#import <UIKit/UIKit.h> @interface UIFont (APCAppearance) + (UIFont*) appRegularFontWithSize: ...
- MYSQL 二次筛选,统计,最大值,最小值,分组,靠拢
HAVING 筛选后再 筛选 SELECT CLASS,SUM(TOTAL_SCORES) FROM student_score GROUP BY CLASS HAVING SUM(TOTAL_SCO ...