Java持久性API(JPA)第7讲——实体生命周期及生命周期回调方法

目标与主要内容:
u 掌握实体的生命周期;
u 掌握实体的生命周期的转换;
u 掌握实体的生命周期回调方法的使用;
1、 实体的生命周期
参考书上362页。
4种状态:
u 新建:没有持久标识,并且没有与上下文环境关联。
u 分离的:具有持久标识,并且没有与持久上下文环境关联。
u 管理的:具有持久标识,并且与持久上下文环境关联。
u 删除的:具有持久标识,并且与持久上下文环境关联,但是准备从数据库中删除。
2、 对实体的操作
对实体的各种操作可以改变实体的状态,对这些操作分别介绍如下:
2.1 持久化实体实例
通过persist方法或者被级联persist方法完成。例如可以直接持久化一个订单项,也可以通过持久化订单,该操作可以级联到订单项。
persist操作结果如下:
u 如果是新的实体,则会变成管理的;
u 如果是被管理实体,则该操作被忽略;
u 如果是删除的实体,则将重新变成被管理的;
u 如果是分离的实体,会抛出异常;
u 如果关系中声明的级联操作包括CascadeType.PERSIST,则会把级联的实体持久化。
2.2 删除实体
通过remove方法或者被级联的remove方法完成。例如可以直接删除一个订单项,也可以通过删除订单来删除订单项。
Remove操作的结果如下:
u 如果是新的实体,则该操作被忽略;
u 如果是被管理实体,则会变成删除的;
u 如果是删除的实体,则该操作被忽略;
u 如果是分离的实体,会抛出异常;
u 事务提交的时候或者作为flush操作的结果,删除的实体将从数据库中删除。
2.3 同步到数据库
通常自动完成,也可以使用flush操作完成。
flush操作的结果如下:
u 如果实体是管理的实体,将被同步到数据库;
u 如果是实体是删除的实体,将从数据库中删除掉。
2.4 分离实体
分离的实体可能来自:
u 事务提交;
u 事务回滚;
u 删除持久上下文;
u 管理实体管理器;
u 串行化一个实体或者通过值传递参数;
在第6讲中,在Servlet中创建的Ordertable对象作为参数传递到会话Bean中的时候,就是这种状态,所以需要先通过merge操作转换成管理的状态,然后再持久化。
2.5 合并分离的实体状态
merge操作可以完成合并操作。合并操作的语法如下:
u 如果是新的实体,则会创建一个新的管理的实体;
u 如果是被管理实体,则该操作被忽略;
u 如果是删除的实体,则产生异常;
u 如果是分离的实体,会创建一个新的管理的实体;
2.6 管理的实体实例
可以通过contains方法来判断实体实例是否被管理。
3、 实体生命周期回调方法
生命周期方法可以定义在
u 实体类;
u 超类;
u 实体类所关联的实体监听器类;
u 超类所关联的实体监听器类;
实体监听器类必须有一个无参数的构造方法。
可以通过元注释指定,也可以通过XML配置文件指定。
3.1 生命周期回调方法的定义
定义在实体类或者超类的回调方法:
void <METHOD>()
定义在实体监听器类的回调方法:
Void <METHOD>(Object o)
回调方法可以是任何访问控制类型,但是不能使用static和final修饰。
3.2 生命周期回调方法使用的元注释
使用的元注释及含义如下:
u PrePersist,持久化之前产生该事件
u PostPersist,持久化之候产生该事件
u PreRemove,删除之前产生该事件
u PostRemove,删除之后产生该事件
u PreUpdate,更新之前产生该事件
u PostUpdate,更新之后产生该事件
u PostLoad,加载之后产生该事件
3.3 实例
在第6讲的Ordertable实体类中增加如下7个生命周期回调方法:
@PostLoad
public void postLoad(){
System.out.println("PreLoad生命周期方法被调用!");
}
@PreRemove
public void preRemove(){
System.out.println("PreRemove生命周期方法被调用!");
}
@PrePersist
public void prePersist(){
System.out.println("PrePersist生命周期方法被调用!");
}
@PreUpdate
public void preUpdate(){
System.out.println("PreUpdate生命周期方法被调用!");
}
@PostPersist
public void postPersist(){
System.out.println("PostPersist生命周期方法被调用!");
}
@PostRemove
public void postRemove(){
System.out.println("PostRemove生命周期方法被调用!");
}
@PostUpdate
public void postUpdate(){
System.out.println("PostUpdate生命周期方法被调用!");
}
@Remove
public void remove(){
System.out.println("remove方法被调用!");
}
如果要持久化一个订单,会得到如下的输出结果:
PrePersist生命周期方法被调用!
PostPersist生命周期方法被调用!
如果要调用下面的代码:
Ordertable order = em.find(Ordertable.class,orderid);
Orderdetail item = new Orderdetail(orderid,goodsid);
em.persist(item);
item.setQuantity(quantity);
if(order.getOrderdetailCollection()==null)
order.setOrderdetailCllection(new Vector<Orderdetail>());
order.getOrderdetailCollection().add(item);
item.setOrdertable(order);
会得到如下的输出结果:
PreLoad生命周期方法被调用!
PreLoad生命周期方法被调用!
PreUpdate生命周期方法被调用!
PostUpdate生命周期方法被调用!
从运行结果看调用了两次PreLoad方法,这与持久性提供者有关。
如果执行下面的代码:
Ordertable order = em.find(Ordertable.class,orderid);
em.remove(order);
会得到如下的输出结果:
PreLoad生命周期方法被调用!
PreLoad生命周期方法被调用!
PreRemove生命周期方法被调用!
PostRemove生命周期方法被调用!
因为要先查找到实体才能删除,所以调用了PreLoad方法。
删除也可以使用下面的方法:
em.createQuery("delete from Ordertable o where o.orderid = ?1").setParameter(1,orderid).executeUpdate();
3.4 一个生命周期事件的多个回调方法
同一个生命周期事件可以定义多个回调方法,可以在实体类、实体类的超类或者监听类上,如果定义了同一个生命周期事件的多个回调方法,则调用这些方法的顺序为:
如果有默认的监听器类,先调用默认的监听器类;
如果有实体监听器类,则先调用父层次的实体监听器类,后调用子层次的实体监听器类,如果在同一个实体类上定义了多个实体监听器类,按照定义的顺序执行;
如果父层次定义了生命周期回调方法,调用父层次的生命周期回调方法;
调用子层次的生命周期回调方法。
详细实例参考书上367页。
参考书籍:《Java EE 5实用教程——基于WebLogic和Eclipse》
9、深入理解持久性:实体管理器 本文深入探讨了Java EE平台中的持久性管理,重点介绍了Java持久化API(JPA)和实体管理器(EntityManager)的核心作用。内容涵盖持久性的优势、实体bean的使用、EntityManager的主要方法与生命周期管理、持久化上下文类型、CRUD操作、事务管理、查询API(JPQL与本地SQL)、高级特性(锁定机制、刷新策略)以及性能优化技巧(批量操作、延迟加载)。通过学习这些概念与实践示例,开发者可以提升企业级Java应用的数据管理能力,优化系统性能与数据一致性。 阅读详情

相关推荐

JPA(Java Persistence API,Java持久化API)

一、什么是JPA 对象关系映射ORM(Object-Relation Mapping)是用来将对象和对象之间的关系对应到数据库中表与表之间的关系的一种模式。ORM框架能够将Java对象映射到关系数据库,能够直接持久化复杂的Java对象。ORM框架的出现,使开发者从数据库编程中解脱出来,把更多的精力放在了业务模型与业务逻辑上。目前比较流行的ORM框架有Hibernate、iBatis、TopLin

一万年太久 - 只争朝夕 1万+

深入理解 JPA 实体生命周期回调:高效管理数据持久化操作

通过这些回调方法,我们可以在实体对象的持久化、更新、删除以及加载等操作前后执行特定的逻辑,从而实现数据的自动处理和业务逻辑的自动化管理。本文将深入探讨 JPA 的实体生命周期回调方法,逐一介绍每个回调的作用、使用场景,并通过代码示例展示如何在实际项目中应用这些回调方法。回调方法在实体被从数据库加载到内存后触发。在实体更新操作执行之后触发,通常用于在更新成功后执行某些逻辑,如通知其他系统或服务该实体已更新。回调方法在实体的更新操作执行之前触发,通常用于在实体被更新之前修改数据或者进行数据验证。

IT技术学习与工作笔记分享 715

ndnSIM学习笔记(一)

在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python &gt;= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib...

gaonjzzz的博客 2986

Spring Data Jpa 实体状态分析

(1)前言: 最近在使用Spring Data Jpa开发的时候,发现更新单个对象的时候,可以这么写:  @Transactional(value = "oracleTM")  public E update(Serializable id, E newEntity) {   E entity = getEntity(id);   BeanUtils.copyPropertie...

iteye_4109的博客 666

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1754

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1244

【Spring Data JPA】实体对象生命周期相关注解

介绍SpringDataJPA在操作对象时对象生命周期相关注解和使用。 @PrePersist、@PreRemove、@PreUpdate、@PostLoad、@PostRemove、@PostUpdate; @EntityListeners、@EnableJpaAuditing;

杜小舟的博客 1241

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 102

Spring Data JPA实体的生命周期总结

目录 四种状态 API示例   persist remove merge refresh 参考链接 四种状态 首先以一张图,简单介绍写实体生命周期中四种状态之间的转换关系: 瞬时(New):瞬时对象,刚New出来的对象,无id,还未和持久化上下文(Persistence Context)建立关联。 托管(Managed):托管对象,有id,已和持久化上下文(Per...

草堂三师兄 6398

SAP 凭证分割功能 - 概述&系统配置 - Chapter01/02

为何要进行凭证拆分(分割)?在启用凭证分割之前, 在财务凭证在过账时会自动带出默认的利润中心,这利 润中心一般是从其他对象派生出来的(比如从成本中心、WBS 或资产负债表科 目定义默认的利润中心等),但是某些情况下的财务过账是不会派生出利润中 心的,比如说应收或者应付。如果一笔销售凭证上有两个行项目,10 行对应的成品物料 A 的利润中心为 TPCA-100;公司项目Dr/Cr科目金额利润中心10001Dr应收账款20002Cr库存商品A1500TPCA-1003Cr。

weixin_46525734的博客 3971

Comsol单层焊缝焊接数值模拟:温度场与应力场全流程解析

在工程制造领域,有限元模拟是研究焊接热-力行为、优化工艺参数的重要工具。焊接过程涉及强烈的局部加热和快速冷却,材料经历复杂的非线性和相变,必须通过瞬态分析和热-力顺序耦合,才能准确捕捉移动热源作用下的温度演化与应力塑性积累。这一技术广泛应用于压力容器、船舶结构、车辆制造等场景,用以预测残余应力与变形、评估冷裂纹风险,并为工艺设计提供定量支撑。焊接数值模拟能否真正指导实践,关键在于热源校核、随温度变化的材料参数、合理的边界条件与网格策略。单层焊缝作为焊接模拟的基础模型,涵盖了移动热源加载、熔池形成、高温软化与

weixin_30444111的博客 223

java jpa中year函数_Java持久性API(JPA)第7讲——实体生命周期及生命周期回调方法...

源贴地址:http://blog.youkuaiyun.com/javaeeteacher/archive/2007/06/25/1665345.aspx目标与主要内容:u掌握实体的生命周期;u掌握实体的生命周期的转换;u掌握实体的生命周期回调方法的使用;1、实体的生命周期参考书上362页。4种状态:u新建:没有持久标识,并且没有与上下文环境关联。u分离的:具有持久标识,并且没有与持久上下文环境关联。u管理的...

weixin_34209060的博客 214

Python爬虫实战:模拟登录B站 – 处理Cookie和加密参数

由于B站在登录过程中采用了多种安全措施,包括加密的请求参数和cookie验证,模拟登录成为一项具有挑战性的任务。首先,我们需要获取B站的登录页面,并解析出其中的CSRF令牌和其他隐藏的字段。B站的登录接口通常会包含一些动态的加密参数,我们需要在登录前通过GET请求获取这些信息。本文详细介绍了如何使用Python模拟登录B站,解决加密参数的处理、图形验证码的识别以及登录后的数据抓取。库中的加密方法加密登录请求中的密码。一旦登录成功,我们可以通过维护会话状态,抓取登录后的数据,如个人主页、评论、观看记录等。

2201_76125261的博客 1309

JPA-深度理解

Java应用程序传统上使用JDBC (Java数据库连接)等技术访问关系数据库,来持久存储数据。 由于面向对象技术和关系技术之间的差异,JDBC API要求开发人员手工编写SQL中最基本的CRUD(创建、读取、更新和删除)操作,而这些操作缺乏可移植性。 另外,代码完全依赖于SQL,当从一个数据库转换到另一个数据库时会更加困难。 因为关系技术关注的是数据及其关系,而面向对象不仅强调数据,而且还强调在数据上执行的操作。这导致了面向对象与面向关系不适配。 一个被广泛接受的解决方案是对象关系映射(ORM)。 J

海的那边,还是海吗 6903

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计

define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。

corlin6688的博客 127

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JBoss 系列五十六:JBoss 7/WildFly 集群之 Java Persistence API (JPA) - I(基本理论)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33843409的博客 206

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

[译文]JPA的实施模式:删除实体

原文:JPA implementation patterns: Removing entities作者:Vincent Partington出处:http://blog.xebia.com/2009/04/09/jpa-implementation-patterns-removing-entities/ 过去几周以来我一直在谈论自己在编写JPA应用时发现的实施模式,上两篇博客分别涉

没有自信心的软件开发者 925

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

jpa 托管_JPA 实体管理器

实体管理器概述实体管理器(EntityManager)用于管理系统中的实体,它是实体与数据库之间的桥梁,通过调用实体管理器的相关方法可以把实体持久化到数据库中,同时也可以把数据库中的记录打包成实体对象。实体的四种状态在此之前我们要先了解实体的状态及其转换,见下图JPA 实体生命周期有四种状态新建状态(New):对象在保存进数据库之前为临时状态。此时数据库中没有该对象的信息,该对象的ID属性也为空。...

weixin_39993322的博客 386

JPA EntityManagers,事务及其周围的一切

介绍 对我来说,最令人困惑和不清楚的事情之一是,作为Java开发人员,一直是围绕事务管理的谜团,尤其是JPA如何处理事务管理。 事务什么时候开始,什么时候结束,实体的持久化方式,持久性上下文等等。 诸如Spring之类的框架也无助于理解概念,因为它们提供了另一层抽象,这使事情难以理解。 在今天的帖子中,我将尝试揭露JPA关于实体管理的规范,其事务规范以及如何更好地理解该概念如何帮助我们有效地设计和编码的某些秘密。 我们将努力保持讨论 尽管我们将同时研究Java SE(其中没有Java EE容器)和基于J.

小强快跑~~ 1454

Java Persistence API:快速入门

各位读者好! 在我的一些朋友提出无数请求之后,我决定写一篇关于Java Persistence API的简短文章。 面向对象的编程范式是当​​今最流行和使用最广泛的模型,它具有无缝建模现实生活实体的能力,它胜过大多数其他范式。 但是,在开发诸如学生数据库或员工数据库的中型数据导向应用程序时,人们只是打破了面向对象模型并将数据库连接直接链接到前端GUI。 但这不是一个好的编程习惯。 当我刚开始...

最佳 Java 编程 3177

第三章、实体操作(JPA规范)

本章介绍了如何使用EntityManager API 管理实体实例生命周期以及如何使用查询API来检索和查询实体及其持久状态。 文章目录3.1、EntityManager (实体管理器)3.1.1 EntityManager 接口3.1.2、实体管理API使用的例子3.2、实体实例的生命周期3.2.1、实体实例创建3.2.2、 持久化一个实体实例3.2.3、移除3.2.4、与数据库同步3.2.5、刷新实体实例3.2.6、从持久性上下文中去掉实体实例3.2.7、分离的实体3.2.7.1、合并Detache.

往前的娘娘 1144

一文读懂JPA及Mybatis的原理和机制(面试经)

我们在做应用开发的时候,需要依赖持久层提供数据支撑,比如你要连接MySQL、Oracle、Sqlserver、redis、Mongo等各类DB。为节约资源并提高效率,Java提供了一套持久化API,即JPA。本文先从这个JPA说起,咱们边走边聊~Java 持久化 API (Java Persistence API)是一个Java应用程序接口规范,描述了使用Java SE和Java EE的应用中的关系数据的管理规范。API 本身,定义在 javax.persistence 包内;

splendid_java的专栏 1744
上一篇: Java持久性API(JPA)第8讲——实体管理器和实体管理器工厂
下一篇: NetBeans中JSF应用开发(1)
Java_Web_Book
博客等级 码龄18年 8粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值