关闭

69. JPA实体Bean的生命周期

105人阅读 评论(0) 收藏 举报
分类:

【从零开始学习SpirngBoot—常见异常汇总】

       在使用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(Objectentity)方法,在

entityManager.persist(entity)这个方法之前,demoInfo仍然是处于新生态(new),当执行entityManager.persist(entity)这个方法之后,demoInfo此时demoInfo就处于持久状态(managed),然后save方法执行完毕,返回到testSave()方法继续往下执行,此时的demoInfo就是游离状态(detached)了,此时的游离对象在执行remove方法是抛出异常的 InvalidDataAccessApiUsageException:Removing adetached instance com.kfit.demo.bean.DemoInfo。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

JPA 实体生命周期理解和总结

先来一个图jpa 实体生命周期有四种状态 New:瞬时对象,尚未有id,还未和Persistence Context建立关联的对象。 Managed:持久化受管对象,有id值,已经和Persisten...
  • yingxiake
  • yingxiake
  • 2016-03-24 01:04
  • 2091

Spring Bean生命周期详解

Spring Bean生命周期详解
  • a327369238
  • a327369238
  • 2016-08-12 17:40
  • 7711

Spring IOC -bean对象的生命周期详解

生命周期执行的过程如下: 1)spring对bean进行实例化,默认bean是单例 2)spring对bean进行依赖注入 3)如果bean实现了BeanNameAware接口,spring将b...
  • qq_33642117
  • qq_33642117
  • 2016-07-16 15:29
  • 10901

持久化API(JPA)系列(五)控制实体Bean的生命周期

本文主要讲:控制实体Bean的生命周期。与会话Bean类似,实体Bean也有自己的生命周期,分别对应不同的状态。 下面我们首先来讲解实体Bean的状态和生命周期事件: 1、实体Bean生命周期的4种状...
  • lantingxv_jing
  • lantingxv_jing
  • 2015-04-30 09:55
  • 1218

持久化API(JPA)系列(五)控制实体Bean的生命周期

本文主要讲:控制实体Bean的生命周期。 与会话Bean类似,实体Bean也有自己的生命周期,分别对应不同的状态。 下面我们首先来讲解实体Bean的状态和生命周期事件: 1、实体Bean生命...
  • moridehuixiang
  • moridehuixiang
  • 2015-07-22 16:32
  • 774

持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

下面首先来讲解实体Bean的调用过程,然后通过开发第一个实体Bean,演示该配置与开发的过程,包括以下内容: 1、配置数据源。 2、指定数据源。 3、开发第一个实体Bean--Student.java...
  • lantingxv_jing
  • lantingxv_jing
  • 2015-03-31 15:37
  • 1935

jpa对单个实体bean的crud操作

使用注解方式 底层还是hibernate的实现,jpa是通过一个
  • tangliuqing
  • tangliuqing
  • 2014-07-27 22:05
  • 448

实体bean(entity)配置,jpa增删改api,JPAsql增删改

1.ORM框架必然发展趋势: jdbc->hibernate(是产品,实现jpa规范)->jpa(是规范,不是产品)。 ps:运用jpa规范的API进行编程,不对Hiberbate,topLink...
  • timo1160139211
  • timo1160139211
  • 2017-01-12 20:53
  • 185

实体bean 根据JPA注解 @table @column 构建sql 语句

1.ClassUtils 辅助类  可以传参 实体及属性获取方法名及列名 import java.beans.BeanInfo; import java.beans.IntrospectionExce...
  • qq_32516809
  • qq_32516809
  • 2017-07-14 08:53
  • 282

Spring管理的Bean的生命周期

  • 2016-10-16 23:55
  • 3.23MB
  • 下载
    个人资料
    • 访问:68146次
    • 积分:1372
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:383篇
    • 译文:0篇
    • 评论:10条
    最新评论