JPA核心类与使用
Persistence:
Persistence用于获取EntityManagerFactory实例,这个类中包含一个名为createEntityManagerFactory的静态方法。
这个方法有两个重载的版本:
1)带有一个参数的方法以JPA配置文件中的持久化单元名为参数。
<persistence-unit name="JpaDemo1" transaction-type="RESOURCE_LOCAL">
就是这个JpaDemo1
2)带有两个参数的方法:第一个参数和第一种版本一样,第二个参数传下去的是个Map集合,这个集合可以用来设置JPA的配置。
EntityManagerFactory:
这个接口主要是用来创建EntityManager实例对象,这个接口中约束了4个方法。
createEntityManager():用于创建实体管理器对象的实例
createEntityManager(Map map):map参数用于提供EntityManager的属性
isOpen():用来检测EntityManagerFactory对象是否关闭,在工厂打开之后除非调用close()才会关闭
close():上面也说了,关闭工厂用的,关闭之后在使用抛出异常IllegalStateException
EntityManager:
在JPA规范中,ENtityManager是完成持久化操作的核心对象,实体作为普通Java对象,只有在调用EntityManager将它与数据库互交后变成持久化对象。EntityManager对象在一组实体类与底层数据源之间进行O/R映射的管理。它可以用来管理和更新Entity Bean,根据主键查找Entity Bean,还可以通过JPQL语句查询实例。
实体的状态分为:
1)新建状态:新创建的对象,还没拥有持久化主键
2)持久化状态:已经拥有持久性主键和持久化建立了上下文环境
3)游离状态:拥有持久化主键,但是没有与持久化建立上下文环境
4)删除状态:拥有持久化主键,已经和持久化建立上下文,但是数据库的已经被删除。
现在测试下这个类中的方法如何使用。
find(Class<T> entityClass , Object primaryKey)
第一个参数 entityClass是持久化类的class对象,第二个参数是主键ID,同hibernate种get()方法,一旦执行立即加载,立马发送语句
//获取持久化对象,立即发送sql语句,没有查到对应的数据返回null Student student = entityManager.find(Student.class, 1); System.out.println(student);
getReference(Class<T> entityClass , Object primaryKey)
第一个参数 entityClass是持久化类的class对象,第二个参数是主键ID。同hibernate中load()方法,即使执行使用才加载,使用才发送语句
@Test
public void test3(){
//获取持久化对象,延迟加载使用才发送sql语句,没有查询到对应于的数据抛出异常
Student student = entityManager.getReference(Student.class,1);
System.out.println(student);
}
persist(Object entity)
用于将新建对象纳入到EntitiyManager的管理,该方法执行后这个对象将变成持久化对象。如果对已经处于持久化的对象进行管理那么这个方法什么都不会做,将删除状态的对象传入会将这个对象给持久化。如果将游离状态的对象传入可以抛出异常。
//将新建对象转换为持久化对象
Student student = new Student("AA", "AA-00", 11, "13212341234", "中国-未知-未知");
entityManager.persist(student);
remove(Object entity)
删除实例,只能删除持久化对象同Hibernate。
@Test
public void test5(){
//删除一个持久化对象,数据库对应记录会对应删除
Student student = entityManager.find(Student.class,1);
entityManager.remove(student);
}
createQuery(String hqString)
创建一个查询对象
@Test
public void createQuery(){
//创建一个查询对象
String hql = "from Student";
Query query = entityManager.createQuery(hql);
List<Student> students = query.getResultList();
for (Student student : students) {
System.out.println(student);
}
}
createNamedQuery(String nameString)
根据命名的查询语句块创建查询对象。参数为命名的查询语句。

createNativeQuery (String sqlString):
使用标准 SQL语句创建查询对象。参数为标准SQL语句字符串。
@Test
public void createNativeQuery(){
//使用标准 SQL语句创建查询对象。参数为标准SQL语句字符串。
String sql = "select * from tal_student";
Query query = entityManager.createNativeQuery(sql,Student.class);
List<Student> students = query.getResultList();
for (Student student : students) {
System.out.println(student);
}
//createNativeQuery (String sqls, String resultSetMapping)
//使用标准SQL语句创建查询对象,并指定返回结果集 Map的 名称。
}
merge(T entity)
同HIbernate saveOrUpdate方法,用于持久化对象同步如果没有就Insert 如果有就执行update
flush()
同步持久上下环境意思就是将持久上下文所有没有保存的数据更新到数据库
refresh()
用于更新实体记录的数据
contains(Object entity)
判断一个对象是否是持久化对象
isOpen()
判断实体管理器是否打开
getTransaction()
返回资源层事务对象。
close()
关闭这个实体管理器
EntityTransaction
接口用来管理资源层实体管理器的事务操作。通过调用实体管理器的getTransaction方法 获得其实例。
这里面有几个常用的方法和hibernate中Transaction都是一样的。
Begin()启动一个事务,如果这个事物已经启动抛出一个异常
commit()提交一个事物,提交之后将增删改操作更新至数据库
rollback()回滚一个数据,回滚后所有的操作将失效。
注意我上面那些操作代码使用的是单元测试,@Before中就已经初始化工厂与实体管理器,在@After中对事物进行过提交与资源关闭,没提交事务,上面那些增删改操作都是失效操作。
JPA核心类与使用的更多相关文章
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Hibernate核心类用法-使用Transaction管理事务
一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- android的消息处理有三个核心类:Looper,Handler和Message。
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...
- codeigniter框架扩展核心类---实现前台后台视图的分离
1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/ constants.php中增加 /*m ...
- Activiti源码分析(框架、核心类。。。)
http://jiangwenfeng762.iteye.com/blog/1338553 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要 ...
- Spring Security——核心类简介——获得登录用户的相关信息
核心类简介 目录 1.1 Authentication 1.2 SecurityContextHolder 1.3 AuthenticationManager和Authenti ...
- lucene原理及源码解析--核心类
马云说:大家还没搞清PC时代的时候,移动互联网来了,还没搞清移动互联网的时候,大数据时代来了. 然而,我看到的是:在PC时代搞PC的,移动互联网时代搞移动互联网的,大数据时代搞大数据的,都是同一伙儿人 ...
随机推荐
- 玩转Google
前言: 网上浏览信息,用百度搜索的时候,第一页都是广告,真是槽心到极点,果断放弃百度,现在用谷歌是真舒服,用起一句话用好谷歌.用好搜索引擎.你可以打开世界的大门! 加入特殊字符搜索: | 同时搜索关键 ...
- IE9浏览器打开开发者工具代码正常执行,反之报错
1.can i use console IE9开发者工具打开时支持console对象,否则报错. 2.由于出现错误 80020101 而导致此项操作无法完成 测试代码 <!DOCTYPE ht ...
- 开源RPC Jupiter
ref https://github.com/fengjiachun/doc/tree/master/netty https://budairenqin.iteye.com/ https://blog ...
- zabbix系列~mysql进行监控
一 简介:zabbix进行数据库监控 二 目的:采用percona进行插件式安装监控 三 安装 环境 zabbix_agent 步骤 yum -y install php php-mysql yum ...
- mysql 原理 ~ DDL之mdl锁
一 简介: MDL锁 二 具体 1 MDL锁 1 增删查改 申请MDL读锁 2 ddl语句 1. 拿MDL写锁 2. 降级成MDL读锁 3. 真正做DDL ...
- python基础-----异常问题
---恢复内容开始--- 当发生python不知所措的错误时,python会创建一个异常对象, 如果你编写处理该异常的代码,程序将会继续运行: 如果你未对异常做任何处理,程序将会停止,并显示一个tra ...
- Python运维开发基础01-语法基础【转】
开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...
- Tickets HDU - 1260 水DP
HDU - 1260 现在有n个人要买电影票,如果知道每个人单独买票花费的时间, 还有和前一个人一起买花费的时间,问最少花多长时间可以全部买完票. 直接dp就行,注意下输出和初始化 每次从dp[i-1 ...
- Qt5全局热键第三方库qxtglobalshortcut5使用
1.下载第三方库https://github.com/ddqd/qxtglobalshortcut5. 2.把qxtglobalshortcut5文件放在项目目录下,在项目.pro加入一句,inclu ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...