图中虚线框代表在持久化上下文中,所谓在持久化上下文的意思就是一旦该实体对象处于该环境中的时候,那么此实体的属性发生了任何的改变都会同步到数据库中,无需再自己手工调用管理器的方法,该记录会自动同步,这些操作是由AbstractFlushingEventListener完成。
(3)Spring Data Jpa更新分析
通过AbstractFlushingEventListener执行更新
(4)Spring Data Jpa 实体状态详解
实际上就是new了一个普通的JavaBean对象。
当处在托管状态的实体Bean被管理器flush了,那么就在极短暂的时间进入了持久化状态,事务提交之后,立刻变为了游离状态。您可以把持久化状态当做实实在在的数据库记录。
游离状态就是提交到数据库后,事务commit后实体的状态,因为事务已经提交了,此时实体的属性任你如何改变,也不会同步到数据库,因为游离是没人管的孩子,不在持久化上下文中。
一般要删除一个持久化对象的时候都是先find出来,之后调用remove方法删之,此时这个对象就是销毁对象,实际上就是瞬时对象的另一种形态罢了。
(5)Spring Data Jpa 应用分析
用于查询单记录实体,和find相似
代码如下
// 加载一个实体 T entity = entityManager.getReference(entityClass, id); |
它与find的区别就是:当根据主键查询记录不存在的时候,将抛出异常EntityNotFoundException。这样我们就可以捕获异常后做一些自己的处理。
提交(调用flush)分为2种方式:
AUTO:自动提交,实体管理器会在适当的时机同步实际记录到数据库,也是默认的提交方式。
COMMIT:一旦一个事务完毕了,那么就立刻提交到数据库(忽略事务共享、事务传播)。
很多人建议使用默认的AUTO。
有的时候我们需要循环保存数据,当保存大量数据的时候,如果到最后才提交所有数据,那么数据库的负载可能会比较大。我们可以这样做,每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条记录的时候就强制提交。
该方法是和flush()相反,是将数据库记录重新读到实体中,这样实体也是出于持久化环境中了,处于托管状态。
该方法是将所有的处于上下文中的实体全部转换成游离状态,此时还没有及时flush到数据库的信息,很遗憾,将不会持久化到数据库中。不是急于释放资源的情况下,请慎用之。
感谢:http://suhuanzheng7784877.iteye.com/blog/892039
相关推荐
在很多情况下,我们使用Spring-Data- Jpa,一些简单的查询,我们都喜欢用定义方法查询,而不是写JPQL。JPA为我们提供了一组注解:使用Spring-Data- Jpa为我们提供的@EntityGraph,或@EntityGraph和@NamedEntityGraph...
Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码.doc
SpringData框架中使用的JPA工具类.模板代码,解决实体管理器工厂的浪费资源和耗时问题.第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象,第二次方法...
Spring Data JPA实体图 没有spring-data-jpa-entity-graph的生活 仅通过注释支持EntityGraph。 因此,对于存储库方法,必须在编译之前最多选择一个EntityGraph。 这样可以避免您在考虑运行时上下文的情况下选择最佳...
《你真的了解Jpa吗?》案例代码,内有SpringBootJPA的入门例子,包括增删改查一级实体关联关系处理。
Spring Data JPA 的目标是通过让一些必须的工作变得更简单,来显著提高数据访问层的实现。作为一个开发者,你写你的仓库界面,包括自定义查询方法,而 Spring 给你提供自动实现。特性对建立基于Spring 和 JPA 的库的...
SpringBoot是一款基于Spring框架的开发框架,而Spring-data-JPA是在Hibernate的基础上实现JPA规范的ORM框架。使用SpringBoot和Spring-data-jpa进行分页查询可以大大简化编码流程并提高开发效率。 在使用Spring-data...
Spring Data JPA和Spring Security Sample项目 连接Spring Data JPA和Spring Security的示例项目 1.配置说明 用户:实现Spring Security的UserDetails界面 Authority:一种实现Spring Security的GrantedAuthority...
Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的)。这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数。这个接口主要是让你能知道继承这个类的接 口的类型。CrudRepository提供了对被...
产生原因:因为使用 jpa 自动创建表的时候,采用的是TreeMap的,我们要变成LinkedHashMap 的结构。 解决方案:在项目下java文件夹下创建包名为: org.hibernate.cfg ,创建类: PropertyContainer [包名,类名...
一、单表查询的一个字段、一条数据 @Query(value = select username from user,nativeQuery = true) // 注意返回值用String类型接收,也可以使用Object String findOneUserName(); 二、单表查询的一个字段、多条...
精装枪前言guns-lite是在的基础上将数据库层由mybatis替换为spring data jpa的系统。 guns-lite是一个基于spring boot的后台管理系统。另提供前预设分离(vue)版本分支master,主分支,稳定版admin-flat该分支将...
春天数据jpa额外使用jpa的spring数据更舒适我爱spring-data-jpa,她放开我的双手,粗鲁的方法很无聊! 然而,尽管她为我们提供了规范解决方案,但她在动态本机查询上并不完美,而且她的返回类型必须是一个实体,但是...
• 实体层,ORM映射 • User类、 Status类、Comment类 • 存储层,数据库CRUD • UserRepository类、StatusRepository类、CommentRepository类 • 服务层,封装复杂业务逻辑 • UserService类、StatusService类...
示例应用程序演示了如何将Hibernate用作Spring Data JPA的JPA提供程序。 当前演示了以下概念: 概念 描述 看 Spring Data JPA存储库 使用再次执行操作关系数据库 直接EntityManager访问 直接访问JPA ...
涉及到动态生成表结构,动态生成模型实体类动态查询表字段等等,经过调研发现hibernate在这方面是很方便的,调用内置API就能完成系列操作,下面贴出核心代码: /** * @author cjbi */ public class DynamicDdlTest...
Spring Boot Data Jpa Example quick start # build mvn clean install # run mvn spring-boot:run 数据库配置 spring.jpa.hibernate.ddl-auto: create 启动时生成表 spring.jpa.hibernate.ddl-auto: create-drop ...
Spring Data JPA的用法该... 代码中的重点: 添加对Spring Data JPA的依赖: 委派给CUBA EntityManager javax.persistence.EntityManager实现: 可以实例化Spring Data存储Bean: 项目实体的存储库接口: 和存储库的
简单的说:ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。 1.1 为什么使用ORM 当实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从...