热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JPA学习笔记三:JPA的API学习

文章目录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


  1. 该类有两个静态方法,一个是通过调用createEntityManagerFactory()方法来创建一个EntityManagerFactory工厂。相当于一个Session工厂。
  2. 另一个是createEntityManagerFactory(String arg,Map map);前面的String对应persistence.xml的名字,后面的Map对应persistence.xml中的一些键值对。

1.2. jpa的EntityManagerFactory接口


  1. 该接口主要用来创建EntityManager实例。该接口约定了4种方法。
    • createEntityManager():用于创建实体管理器对象实例。
    • createEntityManager(Map map);上面的重载方法。
    • isOpen():检查createEntityManagerFactory()是否处于打开状态。
    • close():关闭createEntityManagerFactory并释放资源。

1.3. jpa的EntityManager的方法


  1. find()方法:类似于HIbernate中Session的get()方法。这个方法有个特点就是当调用find方法时,就已经发送了sql语句,而不是需要这个属性时才发的。

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

  1. find()方法:这个方法和Hibernate中Session中的get()方法很类似,就是当调用find()方法时,就已经发送了sql语句,当打印时就就会将查询到的值打印出来,不打印,不会将结果显示出来,只是将sql语句发送了,没有执行而已。

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

  1. getReference():这个方法和Hibernate中Session的load()方法很相似,当调用这个方法时,会返回这个方法的代理,只有打印时才将sql语句和结果打印出来,即:懒加载机制。

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

  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");
//customer.setId(100);
entityManager.persist(customer);

  1. remove()方法:类似于 hibernate 中 Session 的 delete 方法. 把对象对应的记录从数据库中移除但注意: 该方法只能移除 持久化 对象. 而 hibernate 的 delete 方法实际上还可以移除 游离对象

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

  1. merge(T entity):merge()方法用于处理Entity的同步。即数据库的插入和更新操作。类似于Hibernate中的saveOrUpdate()方法。
  2. merge()方法会根据对象的状态,游离态,持久态,临时对象,分为四种操作

merge的四种状态操作


  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());
}

  1. 第二种状态
    • 若传入的是一个游离对象, 即传入的对象有 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());
}

  1. 第三种方式:
    • 若传入的是一个游离对象, 即传入的对象有 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");//执行了三次1.给游离态赋值,2.查询,3,给查询对象赋值customer.setLastName("EE");customer.setId(4);Customer customer2 = entityManager.merge(customer);System.out.println(customer == customer2); //false
}

  1. 第四种状态:
    • 若传入的是一个游离对象, 即传入的对象有 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); //false
}

1.4. jpa的EntityManager的其他方法


  1. flush():同步持久上下文环境,即将持久上下文环境的所有未保存实体的状态信息保存到数据库中。和Hibernate中的flush() 方法一样。
  2. refresh(Object entity)同hibernate中session,用数据库中实体记录,更新实体对象的状态。即更新实体的属性值。

1.5. jpa的事务操作EntityTransaction


  1. begin()开启一个事务。如果事务已经启动,将会抛出IllegalStateException异常。
  2. commit():提交当前事务。
  3. rollback():撤销事务操作。
  4. setRollbackOnly():使当前事务只能被撤销。
  5. getRollbackOnly():查看当前事务是否只能被撤销。
  6. isActive():判断当前事务是否是活动的。

推荐阅读
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
bearden孔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有