简介
EntityManager是JPA中的一个实体管理器,由jpa包导入,负责对外暴露可以对数据库进行增删改查的接口。
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
类型
-
容器托管(container-manager)(推荐)
容器托管的EntityManager对象最简单,不需要考虑EntityManager连接的释放,以及事务等复杂的问题,所有这些都交给容器去管理。容器托管的EntityManager对象必须在EJB容器中运行,而不能在Web容器和J2SE的环境中运行。EntityManager对象通过注入
注释来获得时,这种获得EntityManager对象的方式就是容器托管的。 @PersistenceContext
-
应用托管(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;
方法
用于创建实体管理器对象实例createEntityManager()
用于创建实体管理器对象实例的重载方法,Map 参数用于提供 EntityManager 的属性。createEntityManager(Map map)
检查 EntityManagerFactory 是否处于打开状态(实体管理器工厂创建后一直处于打开状态,除非调用close()方法将其关闭)isOpen()
关闭 EntityManagerFactoryclose()
EntityManager
作用
用于管理Entity的Bean,会跟踪其状态改变,在任何决定更新实体Bean的时候便会把发生改变的值同步到数据库中。
声明
@PersistenceContext
private EntityManger entityManger;
方法
-
查询
-
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对象。
-
-
插入
-
persist
作用:使对象由临时状态变为持久化状态
Person person = new Person(); person.setName(name); //把数据保存进数据库中 entityManager.persist(person);
执行persist的操作,相当于hibernate中的
方法save()
-
-
更新
-
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();
-
-
删除
- remove
Order order = new Order(); order = entityManager.find(Order.class, 140); entityManager.remove(order); //删除的对象必须是从数据库中获取的,持久化的对象 //如果级联关系cascade=CascadeType.ALL,在删除order时候,也会把级联对象删除。 //把cascade属性设为cascade=CascadeType.REMOVE也有同样的效果。
-
刷新
-
flush
用法:用于强制将缓存数据更新到数据库
entityManager.flush();
- setFlushMode() 设置持久上下文环境到flush环境
FlushModeType.AUTO 为自动更新数据库实体,
FlushModeType.COMMIT 为直到提交事务时才更新数据库记录。
- getFlshMode()
获取持久上下文环境到flush模式
-
refresh
用法:查看缓存中数据状态与数据库中是否一致,并刷新
Order order= entityManager.find(Order.class, 170); entityManager.refresh(order);
-
-
contains
用法:使用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回值为true,否则为false
留言