
JPA学习笔记三:JPA的API学习
发布日期:2021-05-28 16:48:26
浏览次数:33
分类:精选文章
本文共 4254 字,大约阅读时间需要 14 分钟。
JPA学习笔记:JPA的API学习
1.1 jpa的类Persistence
Persistence类是JPA中非常重要的核心接口之一。它主要负责创建EntityManagerFactory工厂。Persistence类提供了两个静态方法:
createEntityManagerFactory(String arg, Map map)
: 创建EntityManagerFactory工厂。其中,arg参数是 persistence.xml 文件的位置或名称,map参数是 persistence.xml 中的一些配置参数。createEntityManagerFactory()
:这是一个简单的工厂方法,返回一个EntityManagerFactory实例,相当于Session工厂。 annotations 节段中提到过。
1.2 EntityManagerFactory接口
EntityManagerFactory接口是JPA中用来管理EntityManager实例的接口。该接口主要提供了以下方法:
createEntityManager()
: 创建EntityManager实例。createEntityManager(Map map)
: 返回一个EntityManager实例,同时接受一个参数map,用于指定一些配置信息。isOpen()
: 检查EntityManagerFactory是否处于打开状态。close()
: 关闭EntityManagerFactory并释放相关资源。
这些方法与hibernate中的Session工厂管理方式非常类似。
1.3 EntityManager类及其常用方法
EntityManager类是JPA中操作持久化实体的核心接口。其方法主要包括:
find(Class<T>entityClass, Object id)
: 类似hibernate中的Session.get()方法。当调用find方法时,EntityManager会立即发送SQL查询,并返回指定实体。值得注意的是,与hibernate不同的是,JPA的find方法会在第一次访问实体时发送查询,而hibernate则是按需执行查询。
Customer customer = entityManager.find(Customer.class, 1);
getReference(Class<T>entityClass, Object id)
: 类似hibernate中的Session.load()方法。调用该方法会返回一个对象代理。此代理在第一次运行时需要发送查询,且不会立即加载数据,而是通过懒加载机制定时加载。
Customer customer = entityManager.getReference(Customer.class, 1);
persist(Object entity)
: 类似hibernate中的save()方法。该方法用于将临时对象转换为持久化对象。需要注意的是,如果对象已经有一个标识符(如hibernate的主键),则会抛出异常。
Customer customer = new Customer();customer.setAge(15);customer.setBirth(new Date());customer.setCreatedTime(new Date());customer.setEmail("bb@163.com");customer.setLastName("BB");customer.setId(100);entityManager.persist(customer);
remove(Object entity)
: 类似hibernate中的delete()方法。该方法用于移除持久化对象对应的数据库记录。需要注意的是,该方法仅支持移除已持久化的对象。
Customer customer = entityManager.find(Customer.class, 2);entityManager.remove(customer);
merge(Object entity)
: 类似hibernate中的saveOrUpdate()方法。该方法用于处理 entity 的同步操作,根据 entity 的状态执行相应操作。JPA将其分为四种情况处理:
临时对象:若传入的是临时对象,merge方法会创建一个新的持久化对象,将临时对象的属性复制到新对象中,然后执行 insert 操作。
游离对象:若传入的是游离对象且数据库中没有对应记录,merge方法会创建一个新的持久化对象,将游离对象的属性复制到新对象中,然后执行 insert 操作。
已存在持久化对象:若传入的是已存在持久化对象且数据库中有对应记录,merge方法会更新已存在对象的属性并执行 update 操作。
已存在游离对象:若传入的是已存在游离对象且数据库中有对应记录,merge方法会更新已存在对象的属性并执行 update 操作。
以下是通过测试方法演示merge方法的不同情况:
@Testpublic 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());}
@Testpublic 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());}
@Testpublic 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.find(Customer.class, 4); entityManager.merge(customer); System.out.println(customer == customer2); //false}
@Testpublic 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}
1.4 EntityManager的其他方法
EntityManager类中还提供了以下方法:
flush()
: 同flush()方法,强制将持久上下文中的所有未持久化实体保存到数据库中。refresh(Object entity)
: 类似hibernate中的refresh()方法,通过数据库中实体记录更新实体对象的状态。可以用来更新实体的属性值。
1.5 EntityTransaction事务管理
EntityTransaction接口是JPA中用来管理事务的核心接口。其主要方法包括:
begin()
: 开启一个事务。如果已有事务存在,会抛出IllegalStateException异常。commit()
: 提交当前事务。rollback()
: 撤销当前事务。setRollbackOnly()
: 强制将当前事务设为只能被撤销状态。getRollbackOnly()
: 检查当前事务是否只能被撤销。isActive()
: 判断当前是否有活跃的事务。
这些方法与hibernate中的事务管理方式非常类似。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月10日 11时35分20秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
iJ配置Maven环境详解
2019-03-15
仿QQ登陆界面
2019-03-15
Kafka入门(常见错误)
2019-03-15
HttpServletResponse-完成文件下载
2019-03-15
什么题目的暂时还没想好
2019-03-15
Python中pip安装模块太慢
2019-03-15
docker安装
2019-03-15
N皇后问题解法(递归+回朔)
2019-03-15
面试题 08.01. 三步问题
2019-03-15
剑指 Offer 11. 旋转数组的最小数字
2019-03-15
剑指 Offer 57. 和为s的两个数字
2019-03-15
git 在本地删除、添加远端的源
2019-03-15
字符串的反转
2019-03-15
docker用法
2019-03-15
word文档注入(追踪word文档)未完
2019-03-15
作为我的第一篇csdn博客吧
2019-03-15
Linux Ubuntu 用命令安装MySql
2019-03-15
java中简单实现栈
2019-03-15
ajax异步提交失败
2019-03-15