`
toknowme
  • 浏览: 139872 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring Data Jpa 实体状态分析

 
阅读更多
(1)前言:
最近在使用Spring Data Jpa开发的时候,发现更新单个对象的时候,可以这么写:
 @Transactional(value = "oracleTM")
 public E update(Serializable id, E newEntity) {
  E entity = getEntity(id);
  BeanUtils.copyProperties(newEntity, entity);
  return entity;
 }
没有写任何Update的语句,竟然就自动执行刷新了
 
(2)Spring Data Jpa实体状态分析



 
 

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

 

(3)Spring Data Jpa更新分析

通过AbstractFlushingEventListener执行更新

 
//DAO层
 public Z getEntity(Serializable id) {
  //获取出来的数据是托管状态
  return (Z) entityManager.find(getEntityClass(), new Long(id.toString()));
 }
 
//SERVICE层
 @Transactional(value = "oracleTM", readOnly = true)
 public E getEntity(Serializable id) {
  return getDao().getEntity(id);
 }
 
 @Transactional(value = "oracleTM")
 public E update(Serializable id, E newEntity) {
  E entity = getEntity(id);//托管状态
  BeanUtils.copyProperties(newEntity, entity);//托管中的数据发生变化
  return entity;
 }
 
后台处理日志:
DEBUG: [org.hibernate.event.internal.AbstractFlushingEventListener.(143)prepareEntityFlushes] - Processing flush-time cascades
DEBUG: [org.hibernate.event.internal.AbstractFlushingEventListener.(184)prepareCollectionFlushes] - Dirty checking collections
DEBUG: [org.hibernate.event.internal.AbstractFlushingEventListener.(117)logFlushResults] - Flushed: 0 insertions, 1 updates, 0 deletions to 1 objects
 

(4)Spring Data Jpa 实体状态详解

 

瞬时状态

实际上就是new了一个普通的JavaBean对象。

 

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

 

持久化状态:

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

 

游离状态:

游离状态就是提交到数据库后,事务commit后实体的状态,因为事务已经提交了,此时实体的属性任你如何改变,也不会同步到数据库,因为游离是没人管的孩子,不在持久化上下文中。

 

销毁对象:

一般要删除一个持久化对象的时候都是先find出来,之后调用remove方法删之,此时这个对象就是销毁对象,实际上就是瞬时对象的另一种形态罢了。

 

(5)Spring Data Jpa 应用分析

1.实体管理器高级操作——getReference()

用于查询单记录实体,和find相似

代码如下

// 加载一个实体

T entity = entityManager.getReference(entityClass, id);

它与find的区别就是:当根据主键查询记录不存在的时候,将抛出异常EntityNotFoundException。这样我们就可以捕获异常后做一些自己的处理。

 

2.实体管理器高级操作——提交方式FlushModeType

提交(调用flush)分为2种方式:

AUTO:自动提交,实体管理器会在适当的时机同步实际记录到数据库,也是默认的提交方式。

COMMIT:一旦一个事务完毕了,那么就立刻提交到数据库(忽略事务共享、事务传播)。

很多人建议使用默认的AUTO。

 

3.大量数据分批提交

有的时候我们需要循环保存数据,当保存大量数据的时候,如果到最后才提交所有数据,那么数据库的负载可能会比较大。我们可以这样做,每30个记录就提交(flush)一次。代码如下:

 

 public void updateBatch(List<Z> list) {

  for (int i = 0; i < list.size(); i++) {

   entityManager.merge(list.get(i)); //变成托管状态

   if (i % 30 == 0) {

    entityManager.flush(); //变成持久化状态

    entityManager.clear(); //变成游离状态

   }

  }

 }

 

 public void saveBatch(List<Z> list) {

  for (int i = 0; i < list.size(); i++) {

   entityManager.persist(list.get(i)); //变成托管状态

   if (i % 30 == 0) {

    entityManager.flush(); //变成持久化状态

    entityManager.clear(); //变成游离状态

   }

  }

 }

每到30条记录的时候就强制提交。

 

4.refresh()

该方法是和flush()相反,是将数据库记录重新读到实体中,这样实体也是出于持久化环境中了,处于托管状态。

 

5.clear()

该方法是将所有的处于上下文中的实体全部转换成游离状态,此时还没有及时flush到数据库的信息,很遗憾,将不会持久化到数据库中。不是急于释放资源的情况下,请慎用之。

 

 

感谢:http://suhuanzheng7784877.iteye.com/blog/892039

 

 

  • 大小: 50 KB
4
6
分享到:
评论

相关推荐

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    2. **Entity Management**:Spring Data JPA 提供了对实体(Entity)的管理,包括实体的创建、更新、删除等操作。开发者可以通过 `EntityManager` 和 `EntityManagerFactory` 进行这些操作,但 Spring Data JPA 提供...

    Spring Data JPA 笔记

    至于压缩包中的“helloworld”文件,可能是一个简单的示例项目,通常会包含一个基础的Spring Data JPA配置,一个实体类,以及对应的Repository接口,用于展示Spring Data JPA的基本用法。通过查看这个例子,你可以更...

    spring注解+spring data jpa文档+JPA文档.rar

    Spring框架的核心特性包括依赖注入(DI)和面向切面编程(AOP),并且它还提供了对数据库操作的支持,这主要通过Spring Data JPA和Java Persistence API(JPA)实现。 Spring注解是Spring框架中的一大特色,它极大...

    Spring Data JPA从入门到精通

    《Spring Data JPA从入门到精通》是一本深入解析Spring Data JPA的书籍,它以Spring Boot框架为核心,旨在帮助读者全面理解并熟练运用Spring Data JPA进行数据库操作。Spring Data JPA是Spring Framework的一个模块...

    Spring Data JPA中文文档[1.4.3].zip

    8. **JPA实体**:学习如何定义实体类,使用`@Entity`, `@Table`, `@Id`, `@GeneratedValue`等注解,以及如何处理关系(如`@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`)。 9. **转换和事件处理**:了解...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...

    Spring Data JPA.zip

    在项目中引入 Spring Data JPA 和相应的 JPA 实现(如 Hibernate),配置实体扫描路径、数据源、JPA 配置、Repository 扫描等。 **4. 实体类与表的映射** 使用 `@Entity` 注解标记实体类,`@Table` 定义对应的...

    Spring Data JPA Demo

    Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA) 的交互,JPA 是Java 开发者用来管理和持久化应用程序数据的一种标准。在这个“Spring Data JPA Demo”项目中,我们将深入探讨如何利用...

    spring data jpa简单案例

    **Spring Data JPA 简单案例** Spring Data JPA 是 Spring 框架的一个模块,它为使用 JPA(Java Persistence API)提供了强大的支持,简化了数据访问层的开发。通过使用 Spring Data JPA,我们可以避免编写大量重复...

    spring学习:spring data jpa

    只需定义一个接口,该接口继承自Spring Data提供的Repository接口,并指定实体类和ID类型,Spring Data JPA就会自动生成对应的实现,包含基本的CRUD操作。 2. **Query 方法**:在Repository接口中,可以定义方法名...

    spring data jpa + spring + json demo

    【标题】"spring data jpa + spring + json demo"揭示了这个项目是关于使用Spring Data JPA、Spring框架以及JSON处理的一个示例应用。Spring Data JPA是Spring框架的一个模块,它简化了JPA(Java Persistence API)...

    springBoot整合springData JPA

    **SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...

    Spring Boot整合SpringDataJPA

    在`pom.xml`或`build.gradle`文件中,我们需要添加Spring Boot的starter-data-jpa依赖,这会自动配置JPA的相关组件,如HikariCP连接池、Hibernate实体管理器等。例如,在Maven的`pom.xml`中: ```xml &lt;groupId&gt;...

    Spring Data JPA入门项目02

    Spring Data JPA允许我们在查询方法名后添加`OrderBy`和字段名,如`findAllByOrderByAgeDesc()`,这将返回所有实体,按照年龄降序排列。也可以在`@Query`注解中指定ORDER BY子句。 3. 分页:在处理大量数据时,分页...

    SpringData JPA 参考文档PDF 英文

    实体查询(Entity querying)部分深入讲解了如何利用Spring Data JPA进行高级实体查询,包括使用Specification(规范)来创建动态查询、使用事务性查询方法、锁定机制以及审计元数据(Auditing)的配置。 事务性...

    Spring Data JPA中文文档[1.4.3]

    6. **Auditing**:Spring Data JPA提供审计功能,可以自动记录实体的创建时间和修改时间,只需在实体类上添加相应的注解。 7. **事件监听**:通过实现`PreSaveEventListener`、`PostSaveEventListener`等接口,可以...

    Spring Data JPA Examples 官方源码

    5. **JPA实体类和映射** 在源码中,每个数据表对应一个实体类,如`User`,使用`@Entity`注解标识。`@Table`注解用于指定对应的数据库表名,`@Id`表示主键,`@GeneratedValue`用于生成主键值。属性与列的映射通过`@...

    Spring Data JPA

    在Spring Data JPA中,你可以避免大量编写SQL语句和手动管理实体对象的状态,因为Spring Data JPA为你提供了自动化的数据访问层。下面将详细讲解几个关键知识点: 1. **Entity映射**:在Spring Data JPA中,我们...

    jsf+springdatajpa

    **JSF + Spring Data JPA + MySQL:构建高效数据驱动的Web应用** 在现代Web开发中,JavaServer Faces (JSF)、Spring Data JPA 和 MySQL 的组合是一种常见且强大的技术栈,用于创建数据驱动的Web应用程序。这些技术...

Global site tag (gtag.js) - Google Analytics