Spring Data JPA-JPA对象的四种状态

JPA对象的四种状态

  • 临时状态:刚创建出来,∙没有与EntityManager发生关系,没有被持久化,不处于EntityManager中的对象。实际上就是new了一个普通的JavaBean对象后没有对该对象进行过操作时的状态。

  • 托管状态:∙JavaBean与EntityManager发生关系后将被持久化,该Bean的任何属性改动都会牵涉到数据库记录的改动。也就是说只要我们改动这个Bean的属性,无需我们去调用其他方法,数据库的数据会自动同步。

  • 持久化状态:当处在托管状态的实体Bean被管理器flush了,那么就在极短暂的时间进入了持久化状态,事务提交之后,立刻变为了游离状态。可以把持久化状态当做实实在在的数据库记录。

  • 删除状态:执行remove方法,事物提交之前

  • 游离状态:游离状态就是提交到数据库后,事务commit后实体的状态,因为事务已经提交了,此时实体的属性任你如何改变,也不会同步到数据库,因为游离是没人管的孩子,不在持久化上下文中。如果你new出来一个对象,并为其设置了ID并且是数据库中存在的ID,那么你new出来的这个对象也是游离对象。

图中虚线框代表在持久化上下文中,所谓在持久化上下文的意思就是一旦该实体对象处于该环境中的时候,那么此实体的属性发生了任何的改变都会同步到数据库中,无需再自己手工调用管理器的方法,该记录会自动同步,这些操作是由AbstractFlushingEventListener完成。

伪代码示例:

    public void testPersistenceStatus() {Customer customer = entityManager.find(Customer.class, 1); // 托管状态(managed)customer.setLastName("Zhu");/** 程序执行到这一行如果提交事务或者执行 entityManager.flush();都会自动执行update语句,对数据库中* 的 LAST_NAME 进行修改*/}

当瞬时对象调用了管理器的persist()后,即可将一般的JavaBean做为了持久Bean,该Bean的任何属性改动都会牵涉到数据库记录的改动。一旦该记录flush到数据库之后,并且事务提交了,那么此对象不在持久化上下文中,即:变为了游离(没人管的孩子)状态了。在游离状态的时候调用更新、刷新方法后,游离状态对象就变为了在持久化上下文的托管状态了。 通过管理器的find方法,将实体从数据库查询出来后,该实体也会变为托管形态。

EntityManager不同方法对不同状态下的实例产生的作用效果

public void persist(Object entity);

persist方法可以将实例转换为managed(托管)状态。在调用flush()方法或提交事物后,实例将会被插入到数据库中。
对不同状态下的实例A,persist会产生以下操作:

  1. 如果A是一个new状态的实体,它将会转为managed状态;
  2. 如果A是一个managed状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行INSERT操作;
  3. 如果A是一个removed(删除)状态的实体,它将会转换为受控状态;
  4. 如果A是一个detached(分离)状态的实体,该方法会抛出IllegalArgumentException异常,具体异常根据不同的
    JPA实现有关。
public void refresh(Object entity);

refresh方法可以保证当前的实例与数据库中的实例的内容一致。
对不同状态下的实例A,refresh会产生以下操作:

  1. 如果A是一个new状态的实例,不会发生任何操作,但有可能会抛出异常,具体情况根据不同JPA实现有关;
  2. 如果A是一个managed状态的实例,它的属性将会和数据库中的数据同步;
  3. 如果A是一个removed状态的实例,该方法将会抛出异常: Entity not managed
  4. 如果A是一个detached状态的实体,该方法将会抛出异常。
public void remove(Object entity);

remove方法可以将实体转换为removed状态,并且在调用flush()方法或提交事物后删除数据库中的数据。
对不同状态下的实例A,remove会产生以下操作:

  1. 如果A是一个new状态的实例,A的状态不会发生任何改变,但系统仍会在数据库中执行DELETE语句;
  2. 如果A是一个managed状态的实例,它的状态会转换为removed;
  3. 如果A是一个removed状态的实例,不会发生任何操作;
  4. 如果A是一个detached状态的实体,该方法将会抛出异常。
public void merge(Object entity);

merge方法的主要作用是将用户对一个detached状态实体的修改进行归档,归档后将产生一个新的managed状态对象。
对不同状态下的实例A,merge会产生以下操作:

  1. 如果A是一个detached状态的实体,该方法会将A的修改提交到数据库,并返回一个新的managed状态的实例A2;
  2. 如果A是一个new状态的实体,该方法会产生一个根据A产生的managed状态实体A2;
  3. 如果A是一个managed状态的实体,它的状态不会发生任何改变。但是系统仍会在数据库执行UPDATE操作;
  4. 如果A是一个removed状态的实体,该方法会抛出IllegalArgumentException异常。

EntityManager不同方法对不同状态下的实例产生的作用效果代码实践

伪代码示例:

    public void test() {Customer customer = entityManager.find(Customer.class, 1);// 托管状态(managed)entityManager.remove(customer); // 删除状态(removed)entityManager.persist(customer); // 受控状态}

上面一段代码给人直观的理解就是先查询再删除再添加,执行了三个方法,其实并没有,程序只执行了查询方法。这就是我为什么上面介绍EntityManager不同方法对不同状态下的实例产生的作用效果。

Spring Data JPA-JPA对象的四种状态相关推荐

  1. 用spring管理和实例化对象的四种方式

    用spring管理和实例化对象的四种方式 方式一:无参构造函数(最常用) 对象是spring创建,创建的对象还要交给spring容器管理 bean:豆子 id:在spring容器中Hello对象的名, ...

  2. 回过头来看对象的四种状态强软弱虚引用的理解

    一.对象的四种引用状态描述 在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference).软引用(Soft Reference).弱引用(Weak Refe ...

  3. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  4. 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)

    1.对象头 Java对象头里的Mark Word里默认存储对象的HashCode.分代年龄和锁标记位. 32位JVM的Mark Word的默认存储结构如下图所示: 在运行期间,Mark Word里存储 ...

  5. 在Action类中获得HttpServletResponse对象的四种方法

    Struts2:在Action类中获得HttpServletResponse对象的四种方法 在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和req ...

  6. spring加载ApplicationContext.xml的四种方式

    spring加载ApplicationContext.xml的四种方式 spring 中加载xml配置文件的方式,好像有4种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都 ...

  7. 【Java 并发编程】线程锁机制 ( 锁的四种状态 | 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 | 锁竞争 | 锁升级 )

    文章目录 一.悲观锁示例 ( ReentrantLock ) 二.重量级锁弊端 三.锁的四种状态 ( 无锁状态 | 偏向锁 | 轻量级锁 | 重量级锁 ) 四.锁的四种状态之间的转换 ( 无锁状态 - ...

  8. java线程四种状态

    一个线程可以有四种状态: 1.新(new), 即线程刚刚创建,而并未执行 2.可运行(runnable),意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行.因此,线程可 ...

  9. 【Hibernate框架开发之五】Hibernate对象的三种状态Session常用方法

    1. Hibernate对象的三种状态:(图解如下:) 如图所示,Hibernate对象有三种状态,1.Transient  2.Persistent 3.Detached; 三种状态的区别如下: 1 ...

最新文章

  1. 理解oracle中连接和会话
  2. Python3学习笔记-使用list和tuple
  3. 微信开放JS-SDK,助力网页开发[转自微信官方]
  4. 基于机器学习梯度下降优化算法来寻找最佳的线性回归模型
  5. 因一个计算机故障而“停工”!观测宇宙 30 多年的哈勃太空望远镜还能坚持多久?...
  6. c++string 输入换行符
  7. opencv 人脸识别 (二)训练和识别
  8. python类型转换astype-numpy数据类型dtype转换
  9. 【渝粤题库】国家开放大学2021春1398分析化学(本)题目
  10. 学习使用资源文件[6] - 菜单资源
  11. java内部类为什么使用很少_Java内部类你真的会吗?
  12. 区块链开发(三)以太坊客户端命令行选项汇总
  13. 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
  14. 计算机网络 | 无盘工作站的建立
  15. 软件过程管理期末复习资料
  16. c语言 虚拟摄像头设备_c++ 虚拟摄像头驱动程序
  17. DoIP节点连接状态管理
  18. return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cSerDe may be incompati
  19. 蓝桥 卷“兔”来袭编程竞赛专场-05棋盘加密 题解
  20. C++ 炼气期之基本结构语法中的底层逻辑

热门文章

  1. Matlab轮廓线图的绘制
  2. 杨百万:股市就要见顶了 但没前一次悲惨
  3. 创业者,守成者,陵夷者,中兴者,乱亡者。
  4. 手机号归属地 libphonenumber
  5. 携号转网手机号归属地查询
  6. PinPoint使用教程
  7. 【ThinkPad E470C 】基本完美 附带镜像EFI等工具-Mojave后续自己升级为10.14
  8. 双足机器人的稳定性判据_双足机器人行走稳定性探究.pdf
  9. 【Hexo搭建个人博客】(十三)Next主题中添加首页文章置顶功能及置顶图标
  10. 【三维目标检测】VoxelNet(三):模型详解