内容纲要

简介

EntityManager是JPA中的一个实体管理器,由jpa包导入,负责对外暴露可以对数据库进行增删改查的接口。

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

类型

  • 容器托管(container-manager)(推荐)

容器托管的EntityManager对象最简单,不需要考虑EntityManager连接的释放,以及事务等复杂的问题,所有这些都交给容器去管理。容器托管的EntityManager对象必须在EJB容器中运行,而不能在Web容器和J2SE的环境中运行。EntityManager对象通过注入 @PersistenceContext注释来获得时,这种获得EntityManager对象的方式就是容器托管的。

  • 应用托管(application-managed)

应用托管的EntityManager对象,程序员需要手动地控制它的释放和连接、手动地控制事务等。但这种获得应用托管的 EntityManager对象的方式,不仅可以在EJB容器中应用,也可以使 JPA脱离EJB容器,而与任何的Java环境集成,比如说Web容器、J2SE环境等。所以从某种角度上来说,这种方式是JPA能够独立于EJB环境运行的基础。

Persistence

作用

​ 可以用persistence创建EntityManagerFactory实例

用法

String persistenceUnitName = "jpa"; 
EntityManagerFactory factory = Persistence.createEntityManagerFactory(persistenceUnitName);

EntityManagerFactory

作用

​ EntityManagerFactory 接口主要用来创建 EntityManager 实例

声明

@PersistenceUnit
private EntityMangerFactory emf;

方法

  1. createEntityManager() 用于创建实体管理器对象实例
  2. createEntityManager(Map map) 用于创建实体管理器对象实例的重载方法,Map 参数用于提供 EntityManager 的属性。
  3. isOpen() 检查 EntityManagerFactory 是否处于打开状态(实体管理器工厂创建后一直处于打开状态,除非调用close()方法将其关闭)
  4. close() 关闭 EntityManagerFactory

EntityManager

作用

​ 用于管理Entity的Bean,会跟踪其状态改变,在任何决定更新实体Bean的时候便会把发生改变的值同步到数据库中。

声明

@PersistenceContext
private EntityManger entityManger;

方法

  1. 查询

    • find
    //查询ID为1的Order
    Order order = entityManager.find(Order.class, 1);
    • getReference
    //查询ID为1的Order
    Order order = entityManager.getReference(Order.class, 1);

    注意:调用getReference()方法,返回的其实并不是order对象,而是一个代理。当你要使用order时,才会真正的调用查询语句来查询order对象。

  2. 插入

    • persist

    作用:使对象由临时状态变为持久化状态

    Person person = new Person();
    person.setName(name);
    //把数据保存进数据库中
    entityManager.persist(person);

    执行persist的操作,相当于hibernate中的save()方法

  3. 更新

    • merge

    工作原理

    (1) 如果容器中存在相同ID的实例,容器就会将内容拷贝进这个受管理的实例,用merge()方法返回受管理的这个实例,但参数依然是不受管理的,只有在flush后才会把实例同步到数据库中。

    (2) 如果容器中不存在相同ID的实例,容器会根据传入的参数Copy出一个受管理的实例,用merge()方法返回受管理的实例,传入的参数依然不受管理,在flush后把实例同步到数据库中。

    情况1:传参对象中没有ID

    Order order = new Order();
    order.setOrderName("hehe");
    Order order2 = entityManager.merge(order);
    //这种情况下,会返回一个带ID的新对象,并对这个新对象insert

    情况2:传参对象有ID,数据库中无记录,entityManager缓存无该对象

    Order order = new Order();
    order.setId(1000);
    order.setOrderName("hehe");
    Order order2 = entityManager.merge(order);
    //这种情况下,会返回一个新的对象,并对该对象执行insert操作。新对象的id是数据库中这条记录的id(比如自增长的id),而不是我们自己传入的id。

    情况3:传参对象有参数,数据库中有记录,entityManager缓存无该对象

    Order order = new Order();
    order.setId(170);
    order.setOrderName("wahahahahah");
    Order order2 = entityManager.merge(order);
    //在这种情况下,会从数据库中查询对应的记录,生成新的对象,然后将我们传入的对象复制到新的对象,fulsh后执行更新操作。 

    情况4:传参对象有ID,entityManager中有缓存对象

    Order order = new Order();
    order.setId(170);
    order.setOrderName("xixixixi");
    //通过find来将对象读入entityManager缓存
    Order order3 = entityManager.find(Order.class, 170);
    Order order2 = entityManager.merge(order);
    //在这种情况下,JPA会把传入的对象赋值到entityManager的缓存中的对象,然后对entityManager缓存中的对象执行更新操作。
    • set

    方法:调用Entity中的set方法对数据进行修改,当容器flush后更新的数据会同步到数据库,这种方法适用于Entity被容器管理时。若是Entity已经脱离了容器管理,则需要使用上述的merge方法。

    //将id为1的实体修改姓名
    Person person = entityManager.find(Person.class, 1);
    person.setName("张小艳");
    entityManager.flush();
  4. 删除

    • remove
    Order order = new Order();
    order = entityManager.find(Order.class, 140);
    entityManager.remove(order);
    //删除的对象必须是从数据库中获取的,持久化的对象
    //如果级联关系cascade=CascadeType.ALL,在删除order时候,也会把级联对象删除。
    //把cascade属性设为cascade=CascadeType.REMOVE也有同样的效果。
  5. 刷新

    • flush

      用法:用于强制将缓存数据更新到数据库

      entityManager.flush();
      • setFlushMode() 设置持久上下文环境到flush环境

      FlushModeType.AUTO 为自动更新数据库实体,

      FlushModeType.COMMIT 为直到提交事务时才更新数据库记录。

      • getFlshMode()

      获取持久上下文环境到flush模式

    • refresh

      用法:查看缓存中数据状态与数据库中是否一致,并刷新

      Order order= entityManager.find(Order.class, 170);
      entityManager.refresh(order);
  6. contains

    用法:使用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回值为true,否则为false

最后修改日期: 2024年1月21日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。