Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多)介绍,SpringDataJpa应用分析

------实体管理器

  实体管理器EntityManager是实体与数据库的桥梁(和事务一起发挥作用),相当于Hibenrtae中的session,Mybatis中的sqlSession。使用方法放个小例子吧

    1. @PersistenceContext
      1. private EntityManager em; // 注入实体管理器
        1. @SuppressWarnings("unchecked")
          1. public Page<Student> search(User user) {
            1. String dataSql = "select t from User t where 1 = 1";
              1. String countSql = "select count(t) from User t where 1 = 1";
                  1. if(null != user && !StringUtils.isEmpty(user.getName())) {
                    1. dataSql += " and t.name = ?1";
                      1. countSql += " and t.name = ?1";
                        1. }
                            1. Query dataQuery = em.createQuery(dataSql);
                              1. Query countQuery = em.createQuery(countSql);
                                  1. if(null != user && !StringUtils.isEmpty(user.getName())) {
                                    1. dataQuery.setParameter(1, user.getName());
                                      1. countQuery.setParameter(1, user.getName());
                                        1. }long totalSize = (long) countQuery.getSingleResult();
                                          1. Page<User> page = new Page();
                                            1. page.setTotalSize(totalSize);
                                              1. List<User> data = dataQuery.getResultList();
                                                1. page.setData(data);
                                                  1. return page;
                                                    1. }
                                                  1.  

                                                  由以上例子可以看出,这个EntityManager其实跟sqlSession差不多,但是为什么要叫做EntityManager(实体管理器),必然有他的道理的。

                                                  讲讲实体。实体总共有4个状态: (persist用于插入,merge用于修改或插入,remove用于删除)

                                                  新建状态(A):新建实体的时候,实体就是属于这个状态,执行persist方法后进入托管状态

                                                  托管状态(B):托管状态,实体属于这个状态就说明实体已经被entityManager管理了

                                                  删除状态(C):略

                                                  游离状态(D):游离状态和A的区别就是D的ID是有值的

                                                  B状态是托管状态,处于B状态的对象,对他们的操作会随着事物自动提交到数据库,提交事务后,B的对象就变成了D状态,D与A的区别是D中的对象的ID是有值的。当entityManager实体管理器执行persist,rollback,refresh,merge方法是,当前对象会变成B状态。

                                                  ------实体基础映射

                                                   @Entity表示这个类是一个实体类

                                                  @Table指定这个实体对应数据库的表名

                                                    1. @columnname="name"length=60nullable=false, unique=false,insertable=false,
                                                        1. columnDefinition = 对应数据库字段类型)
                                                            1. private String name;
                                                                1. @columnname="big"precision = 12, scale = 2
                                                                    1. private BigDecimal big;
                                                                  1.  

                                                                  insertable,updateable表示是否允许插入或更新,

                                                                  precision表示精度,当属性为double或者bigdecimal时,他表示数字的总长度,

                                                                  scale表示小数的位数。

                                                                  主键:

                                                                  @ID

                                                                  @GenerateValue 主键策略

                                                                  ----------AUTO 和默认的一样

                                                                  ----------IDENTITY 自动增长

                                                                  ----------SEQUENCE 序列,oracle使用

                                                                  ------实体高级映射

                                                                  1,一对一

                                                                  Persion     |         Address

                                                                  address_id   |

                                                                  在persion实体中:

                                                                    1. @oneToOne
                                                                        1. @JoinColumn(name = "address_id", refreceColumnName = "aid")
                                                                            1. private Address address;
                                                                          1.  

                                                                          name表示本表关联字段,refreceColumnName表示另一端关联字段名称

                                                                          2,一对多和多对一

                                                                          如下,是一对多和多对一的双向关联,MappedBy指的是关系由哪方来维护,维护的意思就是修改外键的能力,只有关系维护方才可以去修改外键,而被维护方就算级联保存,外键的值是空的。后面有例子说明。

                                                                          如上关系会在user表中增加一个t_id字段,@Joincolumn指的是在当前实体对应的表中增加对该属性的类型实体的外键关联,所以想在哪张表中增加字段就在那个实体里面写@Joincolumn吧,说的好通俗啊。。。。。

                                                                          3,多对多

                                                                          Student        |        中间表student_teacher     |   Teacher

                                                                          在Teacher实体中:

                                                                            1. @ManyToMany
                                                                                1. @JoinTable(name = "teacher_student",JoinColumns = @JoinColumn(name = "teacher_id",refreceColumnName = "tid"),inverseJoinColumns = @JoinColumn(name = "student_id",refreceColumnName="sid"))
                                                                                    1. private List<Student> students;
                                                                                  1.  

                                                                                  @JoinTable表示关联到中间表

                                                                                  name是中间表名字

                                                                                  JoinColumns表示配置关系拥有者与中间表的关联

                                                                                  inverseJoinColumns表示配置关系被拥有者与中间表的关联

                                                                                  (拥有者和被拥有者的意思是比如一对多关系中,生成一张中间表,部门Depart和员工Employee,在部门实体中配置@OneToMany,则关系拥有者是Depart,关系被拥有者是Employee)

                                                                                  级联:

                                                                                  例如

                                                                                  1. @OneToOne(cascade = {CascadeType.ALL},fetch = FetchType.LAZY)

                                                                                  cascade是级联操作,比如增删改,fetch是专门管理级联查询

                                                                                  CascadeType有如下类型:

                                                                                  -----REMOVE     删除当前对象,关联对象也会一起删除

                                                                                  -----ALL              所有操作都会关联删除

                                                                                  -----DETACH

                                                                                  -----MERGE

                                                                                  -----PERSIST

                                                                                  -----REFRESH

                                                                                  FetchType有两类型,默认是懒加载

                                                                                  -----LAZY     懒加载

                                                                                  -----EAGER   急加载

                                                                                  下面!!!!!!!!举个简单的小例子,关系如上面一对多,多对一双向关联的例子,现在做一个根据用户名,查询user及其关联的teacher的方法。如下

                                                                                  哎,真好。

                                                                                  上面也说了。因为jpa默认是懒加载,所以在双向关联时,又要转成json时,就会出现循环迭代,栈溢出(stackoverflow)的异常。所以方法有两个1,手动设置为Null,中断迭代;2,改成单项关联,咦~~~~~~

                                                                                  Spring Data Jpa 应用分析

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

                                                                                  用于查询单记录实体,和find相似 代码如下 // 加载一个实体 T entity = entityManager.getReference(entityClass, id); 它与find的区别就是:当根据主键查询记录不存在的时候,将抛出异常EntityNotFoundException。这样我们就可以捕获异常后做一些自己的处理。

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

                                                                                  提交(调用flush)分为2种方式: AUTO:自动提交,实体管理器会在适当的时机同步实际记录到数据库,也是默认的提交方式。 COMMIT:一旦一个事务完毕了,那么就立刻提交到数据库(忽略事务共享、事务传播)。 很多人建议使用默认的AUTO。

                                                                                  3.大量数据分批提交

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

                                                                                    1. public void updateBatch(List<Z> list) {
                                                                                      1. for (int i = 0; i < list.size(); i++) {
                                                                                        1. entityManager.merge(list.get(i)); // 变成托管状态
                                                                                          1. if (i % 30 == 0) {
                                                                                            1. entityManager.flush(); // 变成持久化状态
                                                                                              1. entityManager.clear(); // 变成游离状态
                                                                                                1. }
                                                                                                  1. }
                                                                                                    1. }
                                                                                                        1. public void saveBatch(List<Z> list) {
                                                                                                          1. for (int i = 0; i < list.size(); i++) {
                                                                                                            1. entityManager.persist(list.get(i)); // 变成托管状态
                                                                                                              1. if (i % 30 == 0) {
                                                                                                                1. entityManager.flush(); // 变成持久化状态
                                                                                                                  1. entityManager.clear(); // 变成游离状态
                                                                                                                    1. }
                                                                                                                      1. }
                                                                                                                        1. }
                                                                                                                      1.  

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

                                                                                                                       4.refresh()

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

                                                                                                                      5.clear()

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

                                                                                                                      Spring Data Jpa系列教程--------实体解析和关联关系的更多相关文章

                                                                                                                      1. Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA

                                                                                                                        大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...

                                                                                                                      2. Spring Data JPA系列5:让IDEA自动帮你写JPA实体定义代码

                                                                                                                        大家好,又见面了. 这是本系列的最后一篇文档啦,先来回顾下前面4篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你 ...

                                                                                                                      3. SpringBoot系列之Spring Data Jpa集成教程

                                                                                                                        SpringBoot系列之Spring Data Jpa集成教程 Spring Data Jpa是属于Spring Data的一个子项目,Spring data项目是一款集成了很多数据操作的项目,其下 ...

                                                                                                                      4. Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍

                                                                                                                        大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

                                                                                                                      5. Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持

                                                                                                                        大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...

                                                                                                                      6. Spring Data JPA 多个实体类表联合视图查询

                                                                                                                        Spring Data JPA 查询数据库时,如果两个表有关联,那么就设个外键,在查询的时候用Specification创建Join 查询便可.但是只支持左连接,不支持右连接,虽说左右连接反过来就能实 ...

                                                                                                                      7. 【ORM框架】Spring Data JPA(一)-- 入门

                                                                                                                        本文参考:spring Data JPA入门   [原创]纯干货,Spring-data-jpa详解,全方位介绍  Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...

                                                                                                                      8. Spring Boot 入门系列(二十七)使用Spring Data JPA 自定义查询如此简单,完全不需要写SQL!

                                                                                                                        前面讲了Spring Boot 整合Spring Boot JPA,实现JPA 的增.删.改.查的功能.JPA使用非常简单,只需继承JpaRepository ,无需任何数据访问层和sql语句即可实现 ...

                                                                                                                      9. SpringBoot学习笔记:Spring Data Jpa的使用

                                                                                                                        更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...

                                                                                                                      随机推荐

                                                                                                                      1. http缓存之lastModified和etag

                                                                                                                        1.cache-control 访问资源 首次访问页面时间:2018.2.1  9:56  (当前时间=GMT时间+8h) 缓存时长max-age:1 day Expire缓存失效时间:2018.2. ...

                                                                                                                      2. Oracle分区表例子

                                                                                                                        分区表 Oracle提供的分区方法有以下几种. 1.范围分区(range) 范围分区是应用范围比较广的表分区方式,它是以列的值的范围来作为分区的划分条 件,将记录存放到列值所在的 range分区中. ...

                                                                                                                      3. 聊聊mq中消息消费的几种方式

                                                                                                                        mq系列文章 对mq了解不是很多的,可以看一下下面两篇文章: 聊聊mq的使用场景 聊聊业务系统中投递消息到mq的几种方式 聊聊消息消费的几种方式 如何确保消息至少消费一次 如何保证消息消费的幂等性 本 ...

                                                                                                                      4. java数据结构和算法05(二叉树)

                                                                                                                        对于树这个数据结构,第一次看到这个树肯定是一脸蒙逼,玛德,树?种树的那个树么?哈哈哈,当然不是,前面我们说过数组添加.删除数据很慢,查询数据很快:而链表添加.删除数据很快,但是查找数据很慢,我们就想啊 ...

                                                                                                                      5. html----有关图像

                                                                                                                        这一节内容可概括为:网页上插入图片,调整图片大小,使用缩略图链接至大图. 图片的三种格式:jpeg     png    gif 照片.复杂图像使用jpeg,单色图像.logo.几何图形使用png以及 ...

                                                                                                                      6. 直接插入排序法原理及其js实现

                                                                                                                        直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程. 首先摸了一张6, 接着摸到一张4,比6小,插到6的前面: 又摸到一张7,比6大,插到6的后面: 又摸到一张5,比6小,比 ...

                                                                                                                      7. wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法

                                                                                                                        原文链接:wordpress在撰写新文章界面的显示选项按钮点击无反应的解决办法 最近升级wordpress之后,发现在文章编辑界面的添加新媒体和可视化按钮点击无反应,如下:  然后就在网上找解决办法, ...

                                                                                                                      8. BaseAdapter的优化

                                                                                                                        传统的 package cct.commonadapter.bean; import android.content.Context; import android.view.LayoutInflat ...

                                                                                                                      9. R Programming week1-Data Type

                                                                                                                        Objects R has five basic or “atomic” classes of objects: character numeric (real numbers) integer co ...

                                                                                                                      10. 从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)

                                                                                                                        随着业务发展,公司需要提高数据安全与性能需求,所以需要对新技术预研(先采坑),做技术积累: 了解相关AlwaysOn 故障转移集群(热备),数据路由(ICX),Moebius(莫比斯数据路由) 决定测 ...