框架学习之JPA(三)

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

学习视频:尚硅谷框架jpa学习(有兴趣的同学留言邮箱)

使用软件:eclipse

Java版本:jdk8

本节目录

三、JPA_API

1.Persistence

2.EntityManagerFactory

3.entityManager

4.EntityTransaction

三、JPA_API

1.Persistence

  • Persistence类是用于获取EntityManagerFactory实例。该类包含一个名为createEntityManagerFactory的静态方法。
  • createEntityManagerFactory方法有如下两个重载方法
    • 带有一个参数的方法以及JPA配置文件persistence。Xmi中的持久化单元名为参数
    • 带有两个参数的方法:前一个参数含义相同,后一个参数Map类型,用于设置JPA的相关属性,这时将忽略其他地方设置的属性。Map对象的属性名必须是JPA实现库提供商的名字空间约定的属性名

2.EntityManagerFactory

  • EntityManagerFactory接口主要用来创建EntityManager实例。该接口约定了如下四个方法

    • createEntityManager():用于创建实体管理器对象实例
    • createEntityManager(Map map):用于创建实体管理器对象实例的重载方法,Map参数用于提供EntityManager的属性。
    • isOpen():检查EntityManagerFactory是否处于打开状态。实体管理器工厂创建后一直处于打开状态,除非用close()方法将其关闭
    • close():关闭EntityManagerFactory。EntityManagerFactory关闭后将释放所有资源,isOpen()方法将返回false,其他方法将不能调用,否则将导致IllegalStateException异常

3.entityManager

实体的状态:

1.新建状态:新创建的状态,尚未拥有持久性主键

2.持久化状态:已经拥有持久性主键并和持久化建立了上下文环境

3.游离状态:拥有持久化主键,但是没有与持久化建立上下文环境

4.删除状态:拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除

  • Find()
//类似于hibernate中session的get方法

@Test

public void testFind() {

Customer customer = entityManager.find(Customer.class, 1);

System.out.println("---------------------------");

System.out.println(customer.toString());

}

  

  • GetReference()
//类似于hibernate中session的load方法

@Test

public void testGetReference() {

Customer customer = entityManager.getReference(Customer.class, 1);

//这是一个代理对象,可能会出现懒加载异常,即在使用当前customer之前就把entityManager关闭,就无法进行数据库访问

System.out.println(customer.getClass().getName());

System.out.println("---------------------------");

System.out.println(customer.toString());

}

  

  • Persist()
//类似于hibernate中的save方法,使对象由临时状态变为持久化状态

//和hibernate的save方法的不同之处:若对象有id,则不能执行insert操作,而会抛出异常

@Test

public void testPersistence() {

Customer customer = new Customer();

customer.setAge(12);

customer.setEmail("937724308@qq.com");

customer.setLastName("xiong");

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

entityManager.persist(customer);

//可以打印Id

System.out.println(customer.getId());

}

  

  • Remove()
//类似于hibernate的delete方法,把对象对应的记录从数据库中移除

//但注意:该方法只能移除持久化对象。二hibernate的delete方法实际上还可以移除游离对象

@Test

public void testRemove() {

Customer customer = entityManager.find(Customer.class, 2);

entityManager.remove(customer);

}

  

  • Merge()
//若传入的是一个游离对象, 即传入的对象有 OID.

//1. 若在 EntityManager 缓存中有对应的对象

//2. JPA 会把游离对象的属性复制到查询到EntityManager 缓存中的对象中.

//3. EntityManager 缓存中的对象执行 UPDATE.

@Test

public void testMerge4(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("dd@163.com");

customer.setLastName("DD");

customer.setId(4);

Customer customer2 = entityManager.find(Customer.class, 4);

entityManager.merge(customer);

System.out.println(customer == customer2); //false

}

//若传入的是一个游离对象, 即传入的对象有 OID.

//1. 若在 EntityManager 缓存中没有该对象

//2. 若在数据库中也有对应的记录

//3. JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中.

//4. 对查询到的对象执行 update 操作.

@Test

public void testMerge3(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("ee@163.com");

customer.setLastName("EE");

customer.setId(4);

Customer customer2 = entityManager.merge(customer);

System.out.println(customer == customer2); //false

}

//若传入的是一个游离对象, 即传入的对象有 OID.

//1. 若在 EntityManager 缓存中没有该对象

//2. 若在数据库中也没有对应的记录

//3. JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中

//4. 对新创建的对象执行 insert 操作.

@Test

public void testMerge2(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("dd@163.com");

customer.setLastName("DD");

customer.setId(100);

Customer customer2 = entityManager.merge(customer);

System.out.println("customer#id:" + customer.getId());

System.out.println("customer2#id:" + customer2.getId());

}

/**

 * 总的来说: 类似于 hibernate Session 的 saveOrUpdate 方法.

 */

//1. 若传入的是一个临时对象

//会创建一个新的对象, 把临时对象的属性复制到新的对象中, 然后对新的对象执行持久化操作. 所以

//新的对象中有 id, 但以前的临时对象中没有 id.

@Test

public void testMerge1(){

Customer customer = new Customer();

customer.setAge(18);

customer.setBirth(new Date());

customer.setCreatedTime(new Date());

customer.setEmail("cc@163.com");

customer.setLastName("CC");

Customer customer2 = entityManager.merge(customer);

System.out.println("customer#id:" + customer.getId());

System.out.println("customer2#id:" + customer2.getId());

}

  

  • SetFlushMode(FlushModeType flushMode):设置持久上下文换进的Flush模式。参数可以取两个枚举l Flush():同步持久上下文,即将持久上下文环境所有未保存实体的状态信息保存到数据库中。

    • FlushModeType.AUTO为自动跟新数据库实体
    • FlushModeType.COMMIT为直到提交事物时才更新数据库记录
  • getFlushMode():获得持久上下文环境的Flush模式。返回FlushModeType的枚举值
  • Refresh(Object entity):用数据库实体记录的值跟新实体对象的状态,即更新实例的属性值
  • Clear():清除持久上下文环境,断开所有关联的实体。如果这是还有未提交的更新则会被撤销
  • Contains(Object entity):判断一个实体是否属于当前持久上下文环境管理的实体
  • lsOpen():判断当前实体管理器是否处于的打开状态
  • getTransaction():返回资源层的事务对象。EntityTransaction实例可以用于开始和提交多个事务。
  • Close():关闭实体管理器,之后若调用实体管理器实例的方法或其派生的查询对象的方法都将抛出IllegalstateException异常,除了getTransaction和idOpen方法

4.EntityTransaction

  • Begin():用于启动一个事务,此后的多个数据库将作为整体被提交或者撤销,若这时事务已经被启动则会抛出异常IllegalstateException
  • commit():用于提交当前事务。即将事务启动以后的所有数据库更新操作持久化至数据库中
  • Rollback():撤销回滚操作。即撤销事务启动以后的的所有数据库更新操作,从而不对数据库产生影响。
  • setRollbackOnly():使当前事务只能被撤销
  • getRollbackOnly():查看当前事务是否设置了只能撤销标志
  • lsActive():查看当前事务是否是活动的。

JPA学习(三、JPA_API)的更多相关文章

  1. JPA学习笔记(8)——映射一对多关联关系

    一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworl ...

  2. JPA学习(六、JPA_JPQL)

    框架学习之JPA(六) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  3. JPA学习(四、JPA_映射关联关系)

    框架学习之JPA(四) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  4. JPA学习(二、JPA_基本注解)

    框架学习之JPA(二) JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中 ...

  5. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  6. JPA学习---第一节:JPA详解

    一.详解 JPA JPA(Java Persistence API)是Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是 ...

  7. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  8. Spring学习---JPA学习笔记

    用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概 ...

  9. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

随机推荐

  1. elasticsearch-analysis-ik windows 环境 IK 中文分词器 的 下载 和 安装

    1,下载插件压缩包(本地测试建议用迅雷下,生产用的绝对不要用迅雷下),链接地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/ ...

  2. [转帖]「白帽黑客成长记」Windows提权基本原理(上)

    「白帽黑客成长记」Windows提权基本原理(上) https://www.cnblogs.com/ichunqiu/p/10949592.html 我们通常认为配置得当的Windows是安全的,事实 ...

  3. sql server CDC报错:超出存储过程、函数、触发器的最大嵌套层数(最大层为32)

     sys.sp_MScdc_capture_job   RAISERROR(22801, 10, -1)      --原本 go sys.sp_MScdc_capture_job; go --修改后 ...

  4. 写 JSP 的痛点,真的非常痛!

    一.前戏 前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服 ...

  5. Java第二周总结报告

    第二周的学习,开始正式实践进行Java的学习. 本周做了什么? 了解的Java的一些基本知识,如Java变量,数据类型和运算符等.Java变量对不同的数据类型最好采用不同的命名规则,合理的命名有利于提 ...

  6. 公共子序列_NOI导刊2011提高(03)题

    题面 这道题有点坑人啊~ 首先,它需要取模,模数是100000000:(窝在这里死了好久好久,看了别人的代码才发现这一点) 然后我发现题解中没有序列自动机的方法,于是就来一发 首先,虽然序列自动机在定 ...

  7. 洛谷 P3386 二分图匹配 题解

    题面 这道题虽然是练习匈牙利算法的,但可以用网络流来切掉它: 我们可以建立一个超级源和一个超级汇,超级源连接左部分点,超级汇连接右部分点: 然后在该图上跑最大流就可以了: PS:我设的超级源是2001 ...

  8. <<C++ Primer>> 第一章 开始 术语表

    术语表 第 1 章 开始 参数(实参, argument): 向函数传递值    赋值(assignment): 抹去一个对象当前值一个新值取代之    缓冲区(buffer): 一个存储区域, 用于 ...

  9. PAT B1021 个位数统计 (15)

    AC代码 #include <cstdio> #include <iostream> #include <cstring> using namespace std; ...

  10. MySQL的日志系统

    一.日志类型 逻辑日志:存储了逻辑SQL修改语句 物理日志:存储了数据被修改的值 二.binlog 1.定义 binlog 是 MySQL 的逻辑日志,也叫二进制日志.归档日志,由 MySQL Ser ...