zoukankan      html  css  js  c++  java
  • 进阶:使用 EntityManager

    JPA中要对数据库进行操作前,必须先取得EntityManager实例,这有点类似JDBC在对数据库操作之前,必须先取得Connection实例,EntityManager是JPA操作的基础,它不是设计为线程安全(Thread-safe)。

    EntityManager实例基本上是从EntityManagerFactory上调用createEntityManager()方法来取得,在 第一个 JPA(单机客户端) 中有看到实际的例子,若您使用容器管理,则可以使用@PersistenceContext注入EntityManger,像是第一个 JPA(容器管理) 所示范的,或者您可以使用@PersistenceUnit注入EntityManagerFactory,再用它来建立EntityManager,如  Servlet 中直接使用 JPA 所示范的。

    EntityManager主要在管理Entity实例生命周期,透过EntityManager,您对Entity实例的操作,可以对应至数据库进行新增、查找、修改、删除、重清等动作,以下先简介API的使用,以Application-Managed EntityManager为例作说明,您必须搭配 Entity 生命周期 以对Entity在EntityManager中的Managed、Detached、Removed状态获得更进一步的了解。

    要新增资料,可以使用EntityManager的persist()方法,这也会让Entity实例处于Managed状态,例如:
    User user = new User();
    // 
    设定 user 相关属性
    entityManager.persist(user);

    若要取得数据表中的数据,使用EntityManager的find()方法,指定主键对象与Class实例来取得对应的数据并封装为对象,查找回的对象会处于Managed的状态:
    User user = entityManager.find(User.class, id);

    若数据库中已有对应数据,则要修改数据有几种方式:
    • 若对象是在Managed状态,例如查找对象之后,直接更新对象,在交易确认之后,对象的更新就会反应至数据表之中:
    User user = entityManager.find(User.class, id);
    user.setName("Justin Lin");
    • 若对象属于生命周期的Detached状态,您可以使用EntityManagermerge()方法将对象转至生命周期的Managed状态,合并对象上之变更:
    //  user 状态有所变动
    entityManager.merge(user);
    • 也可以先使用merge()方法将Detached状态的Entity实例转至Managed的状态,再更新对象,在交易确认之后,对象的更新就会反应至数据表之中:
    User user1 = entityManager.merge(user);
    user1.setName("Justin Lin");

    若要删除数据表中的数据,则对象必须是在Managed的状态,例如用EntityManager的find()方法查找对象,以查找到的对象配合remove()方法来移除,或是使用merge(()方法将Entity处于Managed状态再用remove()移除,移除之后,对象对应不到数据表格中实际的数据,处于Removed状态:
    User user = entityManager.find(User.class, id);
    entityManager.remove(user);

    若在加载某个Entity实例之后,而数据表格因另一个操作而发生变动,您可以使用EntityManager的refresh()方法,将数据表格的更动加载Entity实例中,若Entity先前有了一些更动操作,则会被覆盖:
    entityManager.refresh(user);

    您可以使用EntityManager的flush()方法,强制EntityManager中管理的所有Entity对应的数据表格与Entity的状态同步:
    entityManager.flush();

    EntityManager的clear()方法,可以将EntityManager所管理的Entity实例清除,使Entity处于Detached状态:
    entityManager.clear();

    每个EntityManager都与一个 Persistence Context 关联,EntityManager不直接维护Entity,而是将之委托给Persistence Context,Persistence Context中会维护一组Entity实例,每个Entity在Persistence Context为Managed状态,Entity实例会有Managed、Detached、Removed状态,这在 Entity 生命周期 中再作进一步的说明。
  • 相关阅读:
    使用docker搭建gitlab版本控制系统
    Spring Boot与Docker部署
    CentOS7 使用yum命令安装Java SDK(openjdk)
    配置带用户权限的docker registry v2
    Docker搭建带有访问认证的私有仓库
    CentOS7 关闭防火墙
    CentOS7.2网络配置
    Docker Machine 简介
    docker的常用命令汇总
    实时查看docker容器日志
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3154046.html
Copyright © 2011-2022 走看看