• (三)JPA - 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 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 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

  • 相关阅读:
    视频转高清gif动态图片(Python代码实现)
    Seata总结
    C++智能指针
    【测试理论基础之小程序/h5】
    【深度学习】笔记2-模型在测试集的准确率大于训练集
    【运维自动化-配置平台】如何使用云资源同步功能(腾讯云为例)
    小型目标检测中的Transformer:一个基准和最先进技术的综述
    计算机毕业设计Java教工公寓管理(源码+系统+mysql数据库+lw文档)
    java-php-python--茶店订购管理系统2021计算机毕业设计
    贪心算法之乘船问题
  • 原文地址:https://www.cnblogs.com/look-word/p/16727032.html