`

69. JPA实体Bean的生命周期【从零开始学Spring Boot】

阅读更多

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 【从零开始学习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操作。

       如果Aremove态的实体,该方法会抛出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

 Spring Boot 系列博客】

视频&交流平台

à Spring Boot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

历史章节

 

第一章 快速开始

1、Spring Boot之Hello World

2、Spring Boot之Hello World访问404

 

第二章 Spring Boot之JSON

1、spring boot返回json数据

2、Spring Boot完美使用FastJson解析JSON数据

 

第三章 Spring Boot热部署

1、Spring Boot热部署(springloader)

2、springboot + devtools(热部署)

 

第四章 Spring Boot数据库

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介绍

4、Spring Boot JdbcTemplate

5、Spring Boot集成MyBatis

 

第五章 web开发

1、全局异常捕捉

2、配置server信息

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot添加JSP支持

 

第六章 定时任务

1、Spring Boot定时任务

2、Spring Boot 定时任务升级篇(动态修改cron参数)

3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)

4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)

5、Spring Boot Quartz介绍

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 集成Quartz普通使用

8、Spring Boot 集成Quartz升级版

9、Spring Boot 集成Quartz二次升级版

10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象

 

第七章 Spring Boot MyBatis升级篇

1、Spring Boot MyBatis升级篇-注解

2、Spring Boot MyBatis升级篇-注解-自增ID

3、Spring Boot MyBatis升级篇-注解-增删改查

4、Spring Boot MyBatis升级篇-注解-分页查询

5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效

6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇

8、Spring Boot MyBatis升级篇-注解-@Result

9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题

12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升级篇-XML

14、Spring Boot MyBatis升级篇-XML-自增ID

15、Spring Boot MyBatis升级篇-XML-增删改查

16、Spring Boot MyBatis升级篇-XML-分页查询

17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效

18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)

19、Spring Boot MyBatis升级篇-XML-注解-初尝试

20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter

 

第八章 Spring Boot 知识点1

1、Spring Boot 拦截器HandlerInterceptor

2、Spring Boot启动加载数据CommandLineRunner

3、Spring Boot环境变量读取和属性对象的绑定

4、Spring Boot使用自定义的properties

5、Spring Boot使用自定义的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 监控和管理生产环境

 

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh文件))

 

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

 

3、Spring Boot日志-log4j2

更多查看博客: http://412887952-qq-com.iteye.com/

  • 大小: 20.6 KB
分享到:
评论

相关推荐

    架构探险_从零开始学spring

    《架构探险:从零开始学Spring》是一本深入浅出的Spring框架学习指南,作者通过细致入微的讲解,带领读者逐步掌握Spring的核心概念和技术。Spring作为Java领域最流行的轻量级框架,其广泛应用于企业级应用开发,是...

    Spring中文版基础教程,从0开始教你Spring

    《Spring中文版基础教程》是一本面向初学者的详尽指南,旨在帮助读者从零开始掌握Spring框架的基础知识。Spring是Java开发中最流行的轻量级框架之一,它提供了丰富的功能来简化企业级应用的开发。本教程将带你一步步...

    spring5源码分析笔记

    4. **IoC容器与Bean生命周期**:Spring IoC容器管理Bean的生命周期,包括初始化、正常服务、销毁三个阶段。开发者可以通过接口或注解定制生命周期行为,如InitializingBean、DisposableBean、@PostConstruct和@...

    spring 小项目

    在这个"spring 小项目"中,你可能正在经历从零开始构建一个基于Spring Boot的应用程序的过程,包括设置基础环境、编写 HelloWorld 示例以及解决遇到的小问题。 首先,让我们深入了解一下Spring Boot的核心特点: 1...

    Spring入门书籍

    这本书旨在帮助读者从零开始,逐步掌握Spring框架的基础知识和核心概念,从而在实际项目开发中得心应手。Spring作为Java企业级应用的主流框架,其强大的功能和灵活性使其在现代软件开发中占据着举足轻重的地位。 书...

    Spring新手教程3件套.rar

    总的来说,这份Spring新手教程3件套将帮助你从零开始,逐步掌握Spring框架的各个方面,无论是基本的依赖注入,还是进阶的Web开发和分布式系统支持,都将为你提供坚实的理论基础和实践经验。通过系统学习并实践这些...

    1.Spring前世今生与Spring编程思想1

    通过Bean定义,Spring能够管理对象的生命周期和依赖关系。随着JavaBean和EJB的发展,Spring借鉴并超越了这些概念,形成了更高效、更灵活的编程模型。 总结起来,Spring框架不仅是一个单一的框架,而是一个完整的...

    Spring基础教程.pdf

    《Spring基础教程》是针对Java开发人员的一份详尽...本教程通过深入浅出的方式,结合源码分析和实用工具的使用,将帮助读者从零开始掌握Spring框架,提升Java开发技能,为构建高效、稳定的Java企业级应用打下坚实基础。

    spring入门详解.rtfd.zip

    本教程将从零开始,逐步带你了解Spring的核心概念、关键特性以及如何使用它进行实际开发。 首先,Spring框架的核心是依赖注入(Dependency Injection, DI)。通过DI,Spring能够管理对象的生命周期和对象之间的依赖...

    spring-framework-learning-code:从0开始深入学习Spring小册子原始码-源码开源

    《Spring框架学习代码:从零开始深入学习Spring小册子源码开源》 Spring框架是Java开发中的核心组件,尤其在企业级应用中占据主导地位。这个开源项目提供了从零开始学习Spring框架的源码,旨在帮助开发者深入理解...

    Spring优先计划

    文件名"spring-first-program-master"暗示了这是一个关于Spring初学者的项目,可能包含一系列的示例代码、教程和练习,帮助你从零开始掌握Spring框架。在实践中,你可以期待学习如何创建Spring Boot项目、配置Spring...

Global site tag (gtag.js) - Google Analytics