首页 > 其他分享 >(三)JPA - EntityManager的使用

(三)JPA - EntityManager的使用

时间:2022-09-25 00:12:24浏览次数:82  
标签:getTransaction entityManager Course JPA JPAEntityFactory course EntityManager 使用

(二)JPA 连接工厂、主键生成策略、DDL自动更新

建议在需要使用时,看看之前的文章,先把环境搭起来。

4、EntityManager

EntityManager 是完成持久化操作的核心对象。

EntityManager 对象在一组实体类与底层数据源之间进行 O/R 映射的管理。它可以用来管理和更新 Entity Bean, 根椐主键查找 Entity Bean, 还可以通过JPQL语句查询实体。

上面测试代码中,已经使用过EntityManager完成持久化操作。

实体类的状态:

新建状态: 新创建的对象,尚未拥有持久性主键;

持久化状态:已经拥有持久性主键并和持久化建立了上下文环境;

游离状态:拥有持久化主键,但是没有与持久化建立上下文环境;

删除状态: 拥有持久化主键,已经和持久化建立上下文环境,但是从数据库中删除。

4.1 persist 增

persist (Object entity):用于将新创建的 Entity 纳入到 EntityManager 的管理。该方法执行后,传入 persist() 方法的 Entity 对象转换成持久化状态。

如果传入 persist() 方法的 Entity 对象已经处于持久化状态,则 persist() 方法什么都不做。

如果对删除状态的 Entity 进行 persist() 操作,会转换为持久化状态。

如果对游离状态的实体执行 persist() 操作,可能会在 persist() 方法抛出 EntityExistException(也有可能是在flush或事务提交后抛出)。

测试代码:

   @Test
    public void testPersist() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        // 新建状态实例 
        Course course = new Course();
        course.setCname("Spring编程实战");
        course.setStart(DateUtil.stringToDate("2022-09-19"));
        course.setEnd(DateUtil.stringToDate("2022-12-30"));
        course.setCredit(2);
        course.setNum(88);
        // 对新建状态 持久化
        entityManager.persist(course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }
// 日志信息
insert into course (cname, credit, end, num, start) values (?, ?, ?, ?, ?)

如果设置了id,就说明这是一个游离状态的实体类,执行会出现异常

4.2 merge 增\改

merge() 用于处理 Entity的同步。即数据库的插入和更新操作。

image-20220921215136231

测试代码: 传入新建状态的对象

    @Test
    public void testMerge() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        Course course = new Course();
        course.setCname("Spring编程实战");
        course.setStart(DateUtil.stringToDate("2022-09-19"));
        course.setEnd(DateUtil.stringToDate("2022-12-30"));
        course.setCredit(2);
        course.setNum(88);
        // 对新建状态 持久化
        entityManager.merge(course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

查看日志,可以看到,执行的是插入操作。

insert into course (cname, credit, end, num, start) values (?, ?, ?, ?, ?)

测试代码: 传入游离状态对象

    @Test
    public void testMerge() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        Course course = new Course();
        course.setCid(2L);
        course.setCname("Spring编程实战");
        course.setStart(DateUtil.stringToDate("2022-09-19"));
        course.setEnd(DateUtil.stringToDate("2022-12-30"));
        course.setCredit(2);
        course.setNum(88);
        // 对新建状态 持久化
        entityManager.merge(course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

查看日志,可以看到,执行的是Update语句

update course set cname=?,credit=?,end=?, num=?, start=? where cid=?

4.3 remove 删

删除实例。如果实例是被管理的,即与数据库实体记录关联,则同时会删除关联的数据库记录。

注意:该方法只能移除持久化对象。

 @Test
    public void testRemove() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        // 查询
        Course course = entityManager.find(Course.class, 2);
        // 对新建状态 持久化
        entityManager.remove(course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

查看日志,可以看到,执行的是Delete语句

delete from course where cid=?

4.4 find 查

find (Class<T> entityClass,Object primaryKey):返回指定的 OID 对应的实体类对象。

第一个参数为被查询的实体类类型,第二个参数为待查找实体的主键值。

如果这个实体存在于当前的持久化环境,则返回一个被缓存的对象;否则会创建一个新的 Entity, 并加载数据库中相关信息;若 OID 不存在于数据库中,则返回一个 null。

    @Test
    public void testFind() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        // 查询主键为3L
        Course course = entityManager.find(Course.class, 3L);
        loggerFactory.info("【find查询结果:】{}", course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

查看日志信息:【find查询结果:】Course(cid=3, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

4.5 getReference

getReference (Class<T> entityClass,Object primaryKey):与find()方法类似。

不同的是:如果缓存中不存在指定的 Entity, EntityManager 会创建一个 Entity 类的代理,但是不会立即加载数据库中的信息,只有第一次真正使用此 Entity 的属性才加载,所以如果此 OID(主键) 在数据库不存在,getReference() 不会返回 null 值, 而是抛出EntityNotFoundException。

    @Test
    public void testGetReference() {
        // 获取连接
        EntityManager entityManager = JPAEntityFactory.getEntityManager();
        // 开启事务
        entityManager.getTransaction().begin();
        Course course = entityManager.getReference(Course.class, 3L);
        loggerFactory.info("【find查询结果:】{}", course);
        // 提交事务
        entityManager.getTransaction().commit();
        // 关闭连接
        JPAEntityFactory.close();
    }

查看日志信息:【find查询结果:】Course(cid=3, cname=Spring编程实战, start=2022-09-19, end=2022-12-30, credit=2, num=88)

不存在,则会抛出异常:

image-20220921222722234

标签:getTransaction,entityManager,Course,JPA,JPAEntityFactory,course,EntityManager,使用
From: https://www.cnblogs.com/look-word/p/16727032.html

相关文章

  • springboot中使用mybatisplus自带插件实现分页
    springboot中使用mybatisplus自带插件实现分页1.导入mybatisplus分页依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-......
  • Linux 宿主机故障虚拟机重启rhel6网卡报已使用故障&rhel7网卡无法启动
    宿主机故障虚拟机重启rhel6网卡报已使用故障&rhel7网卡无法启动宿主机故障虚拟机重启rhel6网卡报已使用一、故障分析1、故障现象:RHEL6虚拟机无论怎么重启虚拟机和重启网......
  • PICT使用总结
    前言:PICT介绍:   PICT工具是微软公司出品的一款成对组合的命令行生成工具,是一个测试用例生成软件。PICT可有效地按照两两测试Pairwise的原理来进行测试用例设计。在使......
  • JDK19新特性使用详解
    前提JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用。新特性列表新特性列表如下:JPE-405:Record模式(预览功能)JPE-422:JDK移植到Linux/RISC-VJPE-424:外......
  • 在 linux 上使用 PICT 进行 Pairwise 测试
    介绍PICT(PairwiseIndependentCombinatorialTesting),是微软开发的用于 Pairwise 的用例生成工具,按照规定的数据结构设置,PICT 默认会按照两两组合的原理设计并输出测试......
  • 关于tkinter中lambda函数使用的注意事项与陷阱分析
    背景:今天笔者使用tkinter开发了一个小的gui工具,分别基于列表的方式创建存储了一堆的文本框与复制按钮想的是复制按钮一一对应文本框,因为有着这样的规律,文本框与复制按钮的......
  • 神经网络----为什么使用向量化
    我们在处理大数据的时候,尽量避免使用for循环,那样会将低速度importnumpyasnpimporttimea=np.random.rand(1000000)b=np.random.rand(1000000)tic=time.ti......
  • [Jetpack Compose] 使用 Snackbar 实现退出应用再确认功能
    @OptIn(ExperimentalMaterial3Api::class)@ComposablefunDemoFun(){varscope=rememberCoroutineScope()varsnackbarHostState=remember{SnackbarHos......
  • Feign在微服务中的一般使用
    1.首先确认配置环境1.1是否微服务之间都已注册进配置中心且未被相互隔离(如nacos)1.2是否开启注解/***使用FeignClient端的微服务(请求)**///Application.java......
  • Optional使用
     importjava.util.HashMap;importjava.util.Map;//最外层对象publicclassOuter{Nestednested;NestedgetNested(){returnnested;}......