原文链接:http://blog.csdn.net/han_yankun2009/article/details/45395271
上篇咱们简单介绍了JPA EntityManager的基本操作,咱们今天接着,更深一层次的介绍EntityManager。
1级联操作
2实体状态
3 数据同步
1 级联操作
1.1 持久化带关系和实体
上次,我们只是持久了一个客户实体,如果创建客户的时候,同样持久化客户所对应的地址实体,如何操作呢?JPA中提供了多种持久化带关系的实体
首先看以下客户与地址的关系
代码
- Publicclass Customer implemets Serializable
- {
- //级联持久化
- @OneToOne(cascade = CascadeType.PERSIST)
- Private Address address;
- }
Cascade ,当调用persist方法持久化客户实体时
cascade = CascadeType.PERSIST,客户所关联的实体也自动时就化
持久化客户实体
- customer.setAddress(address);
- em.persist(customer);
这样,只需要持久化客户实体,对应固定实体也将自动持久化了,而不需要持久化两次
实体属性及加载方式
实体一旦通过find方法查询后,实体的属性可以有两种方式加载,分别是即时加载(EAGER)和惰性加载(LAZY),
fetch = FetchType.ELAZY懒加载
fetch = FetchType.EAGER即时加载
对于LAZY加载,只有当使用该实体属性时,才执行查询的SQl,将属性加载进来,如果不显示的调用,该属性用于也不会加载到客户实体中,而且当该实体具有多条数据,使用懒加载,容易造成频繁访问数据库,出现 N+1问题。若数据量少,该方式还是一个很好的选择,若以一种方式没有绝对的好或不好
1.2 更新实体关系
前面我们说道持久化带关系的实体内容时,了解到通过设置实体关系级联属性cascade可以调用persist方法自动持久化实体关系,同样对于更新实体锁对应关系,也是使用的。 merge方法同时更新实体对应的关系实体
- Publicclass Customer implemets Serializable
- {
- //级联更新设置
- @OneToOne(cascade = CascadeType.MERGE)
- Private Address address;
- }
此时客户端可以通过首先查找客户实体,通过get或set方式对地址实体进行修改,即可实现客户地址的修正。
- Cusetomer customer = cuseomerBean.findById("UUID");
- customer.geteAddress.setZip("056000");
- cuseomerBean.updateEntity(customer);
当调用merge方法,实体管理器不仅检查客户实体是否修改i啊,也检查锁关联的地址实体,若为瞬时态,自动持久化,然后保存,若为托管,则更新到数据中。例如:新创建一个地址实体,也是可以持久化的
- Cusetomer customer = cuseomerBean.findById("UUID");
- Address address = new Address();
- address.setZip("056000");
- customer.setAddress(address);
- cuseomerBean.updateEntity(customer);
方法操作的背后还是要看现象的,不然理解起来不知所然呀
2 实体状态
一个实体从创建到销毁经历了多个状态,EntityManager是如果管理这些实体的,现在咱们就揭开这个面纱吧
通常有这样几个状态 瞬时态(transient),托管(managed)以及销毁(Removed),与Hibernate大相径庭
举例说明:
瞬时态:对象未保存数据库中,通过NEW对象,在内存中,为持久化
持久态:相对瞬时态,调用persist,保存在数据库中
托管态(Managed):是由上下文(persistence Contexgts)管理,是实体处于上下文可被管理的范围内。
游离太:相对托管态,实体不在上下文中时,处于游离态,
游离太情况:
- 事务结束,实体超出作用域
- 复制实体或序列化,实体处于游离态
- 调用clear,是有实体都处于游离态
销毁态
实体从数据库中删除后,处于销毁状态,但必须是在托管状态下删除,否则抛出异常
3 数据同步
也许你会认为,当调用persist,merge或mremove方法时,就已经将实体保存到数据库中,但事实并不是这样的,这些方法知识改变了实体所处的状态,最终保存到数据库中,使用的是flush方法
何时使用该方法何时呢,这需要了解flush提交的方式,默认是
AUTO自动调教,实体管理器根据事务结束后,会调用flush方法,
设置模式是
- Publicenum FLushModeType{
- AUTO;
- COMMIT
- }
总结:
认识了实体管理器的级联操作和生命周期管理后,对期有了基本的概念,同时对一些关系的设置也有了感官,整体上有了一个提升,JPA EntityManager高级
相关推荐
精通 JPA hibernate-JPA高手进阶
黑马程序员,黑马JavaEE 57期,Spring Data JPA 上课的代码和资料
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
spring-data-jpa知识。
jpa jpa规范 jpa源码 jpa jpa规范 jpa源码
JPA教程JPA教程JPA教程JPA教程JPA教程
jpajpajpajpajpajpajpajpajpajpajpajpajpa
JPA视频_PPT及源码 · 1. JPA视频_概述 · 2. JPA视频_HelloWorld · 3. JPA视频_基本注解 · 4. JPA视频_Transient注解 · 5. JPA视频_Temporal注解 · 6. JPA视频_Table主键生成策略 · 7. JPA视频_...
包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注
Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍.doc
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联映射jpa 关联...
spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习
JPA用于整合现有的ORM技术,可以简化现有Java EE和Java SE应用的对象持久化的开发工作,实现ORM的统一。JPA作为一项对象持久化的标准,不但可以获得Java EE应用服务器的支持,还可以直接在Java SE中使用。JPA必将...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
Spring Data JPA中文文档1.4.3
jpa 全面学习资料 入门 实战 示例 jpa开发手册 JPA_全面讲解 JPA使用入门_基础 JPA学习笔记 JPA注解 JPA简介
这是JPA标签配置手册,从ORACLE官方得到的资料,里面对JPA所有的标签都进行详细的说明。 Index of Annotations • A o @AssociationOverride o @AssociationOverrides o @AttributeOverride o @AttributeOverrides ...
JPA学习参考文档 JPA学习参考文档 JPA学习参考文档
Spring Data JPA 简化 JPA 开发