作者:bearden孔 | 来源:互联网 | 2023-09-15 21:25
文章目录1.JPA学习笔记三:JPA的API学习1.1.jpa的类Persistence1.2.jpa的EntityManagerFactory接口1.3.jpa的E
文章目录
- 1. JPA学习笔记三:JPA的API学习
- 1.1. jpa的类Persistence
- 1.2. jpa的EntityManagerFactory接口
- 1.3. jpa的EntityManager的方法
- 1.4. jpa的EntityManager的其他方法
- 1.5. jpa的事务操作EntityTransaction
1. JPA学习笔记三:JPA的API学习
1.1. jpa的类Persistence
- 该类有两个静态方法,一个是通过调用createEntityManagerFactory()方法来创建一个EntityManagerFactory工厂。相当于一个Session工厂。
- 另一个是createEntityManagerFactory(String arg,Map map);前面的String对应persistence.xml的名字,后面的Map对应persistence.xml中的一些键值对。
1.2. jpa的EntityManagerFactory接口
- 该接口主要用来创建EntityManager实例。该接口约定了4种方法。
- createEntityManager():用于创建实体管理器对象实例。
- createEntityManager(Map map);上面的重载方法。
- isOpen():检查createEntityManagerFactory()是否处于打开状态。
- close():关闭createEntityManagerFactory并释放资源。
1.3. jpa的EntityManager的方法
- find()方法:类似于HIbernate中Session的get()方法。这个方法有个特点就是当调用find方法时,就已经发送了sql语句,而不是需要这个属性时才发的。
Customer customer = entityManager.find(Customer.class, 1);
- find()方法:这个方法和Hibernate中Session中的get()方法很类似,就是当调用find()方法时,就已经发送了sql语句,当打印时就就会将查询到的值打印出来,不打印,不会将结果显示出来,只是将sql语句发送了,没有执行而已。
Customer customer = entityManager.find(Customer.class, 1);
- getReference():这个方法和Hibernate中Session的load()方法很相似,当调用这个方法时,会返回这个方法的代理,只有打印时才将sql语句和结果打印出来,即:懒加载机制。
Customer customer = entityManager.getReference(Customer.class, 1);
- persist()方法:这个类似于Hibernate的save()方法,使对象由临时状态变为持久化状态。和Hibernate的Save方法不同之处在于:若对象有id,则不能执行insert操作,而会抛出异常。
Customer customer = new Customer();
customer.setAge(15);
customer.setBirth(new Date());
customer.setCreatedTime(new Date());
customer.setEmail("bb@163.com");
customer.setLastName("BB");
entityManager.persist(customer);
- remove()方法:类似于 hibernate 中 Session 的 delete 方法. 把对象对应的记录从数据库中移除但注意: 该方法只能移除 持久化 对象. 而 hibernate 的 delete 方法实际上还可以移除 游离对象
Customer customer = entityManager.find(Customer.class, 2);
entityManager.remove(customer);
- merge(T entity):merge()方法用于处理Entity的同步。即数据库的插入和更新操作。类似于Hibernate中的saveOrUpdate()方法。
- merge()方法会根据对象的状态,游离态,持久态,临时对象,分为四种操作 。
- 第一种状态:
- 第一种:若传入的是一个临时对象会创建一个新的对象, 把临时对象的属性复制到新的对象中, 然后对新的对象执行持久化操作. 所以新的对象中有 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());
}
- 第二种状态
- 若传入的是一个游离对象, 即传入的对象有 OID. 若在 EntityManager 缓存中没有该对象, 若在数据库中也没有对应的记录, JPA 会创建一个新的对象, 然后把当前游离对象的属性复制到新创建的对象中,对新创建的对象执行 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());
}
- 第三种方式:
- 若传入的是一个游离对象, 即传入的对象有 OID. 若在 EntityManager 缓存中没有该对象, 若在数据库中也有对应的记录,JPA 会查询对应的记录, 然后返回该记录对一个的对象, 再然后会把游离对象的属性复制到查询到的对象中.对查询到的对象执行 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);
}
- 第四种状态:
- 若传入的是一个游离对象, 即传入的对象有 OID. 若在 EntityManager 缓存中有对应的对象,JPA 会把游离对象的属性复制到查询到EntityManager 缓存中的对象中. EntityManager 缓存中的对象执行 UPDATE. Hibernate就无法执行,因为jpa里面有一个复制的操作。Hibernate里面session不能跟两个相同的对象相关联。
@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);
}
1.4. jpa的EntityManager的其他方法
- flush():同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。和Hibernate中的flush() 方法一样。
- refresh(Object entity)同hibernate中session,用数据库中实体记录,更新实体对象的状态。即更新实体的属性值。
1.5. jpa的事务操作EntityTransaction
- begin()开启一个事务。如果事务已经启动,将会抛出IllegalStateException异常。
- commit():提交当前事务。
- rollback():撤销事务操作。
- setRollbackOnly():使当前事务只能被撤销。
- getRollbackOnly():查看当前事务是否只能被撤销。
- isActive():判断当前事务是否是活动的。