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状态,您可以使用EntityManager的merge()方法将对象转至生命周期的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 生命周期 中再作进一步的说明。

进阶:使用 EntityManager的更多相关文章

  1. Java进阶路线图

    第一阶段 技术名称 技术内容 J2SE(Java基础部分) Java开发前奏 计算机基本原理,Java语言发展简史以及开发环境的搭建,体验Java程序的开发,环境变量的设置,程序的执行过程,相关反编译 ...

  2. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  3. nodejs进阶(4)—读取图片到页面

    我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...

  4. JavaScript进阶之路(一)初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  5. nodejs进阶(3)—路由处理

    1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...

  6. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  7. nodejs进阶(1)—输出hello world

    下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var  http  =  require ...

  8. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  9. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

随机推荐

  1. ListView onItemClick(AdapterView<?> parent, View view, int position, long id)参数详解

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { parent.getA ...

  2. Php 操作事务

    PHP来操作数据库 关于事务操作 连接数据 mysql_connect('localhost','root','123'); 设置字符集 mysql_query('set names utf8'); ...

  3. 隐藏内容_网络推广_seo中级视频教程详解

    课程背景:SEO(Search Engine Optimization),汉译为搜索引擎优化.搜索引擎优化是一种利用搜索引擎的搜索规则来提高目的网站在有关搜索引擎内的排名的方式.SEO目的理解是:为网 ...

  4. Ubuntu Android Studio/IntelliJ IDEA 支持文件中文命名

    Android Studio 默认字体无法使用中文命名文件,中文显示空心方块,使用思源字体,可解析 下载思源字体http://www.cnblogs.com/icgq/p/4195347.html 选 ...

  5. 串操作,C++实现

    对串的基本操作都全已经实现 对kmp,kf字符串替换等功能全都已经实现 由于时间原因.没来得及注释,希望大家参考见谅. 串操作hstring.h头文件实现 //kallen 1 #ifndef _HS ...

  6. Jquery get parameter value

    http://www.sitepoint.com/url-parameters-jquery/ $.urlParam('id') ==> $.urlParam = function(name){ ...

  7. 解决mac下eclipse字体模糊

    在eclipse.app右键,单击“显示包内容”,如下图: 2.找到"info.plist"文件并打开,在文件最后插入配置“<key>NSHighResolutionC ...

  8. 图片grayscale(灰阶效果)webkit内核支持。

    filter:gray;-webkit-filter: grayscale(100%); 置为灰阶等hove时候 -webkit-filter: grayscale(0%);显示出彩色.

  9. “Cache-control”常见的取值有private、no-cache、max-age、must-revalidate等

    网页的缓存由HTTP消息头中的"Cache-Control" 来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为pri ...

  10. WPF 中 TreeListView 的使用

    前段时间在项目开发中需要用 TreeListView 的功能,于是在网上狂搜一通,倒也找到了几个小例子,但还是满足不了我简单的要求,由于时间紧也只能折中凑合着用了.最近时间比较充裕,把其中的例子整理一 ...