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中的事务管理方式非常类似。

    上一篇:lucene学习笔记一:lucene是什么、实现步骤、以及索引的创建、查询、修改、删除...
    下一篇:JPA学习笔记二:jpa注解学习,以及TABLE主键生成策略

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2025年04月10日 11时35分20秒