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 生命周期 中再作进一步的说明。

最新文章

  1. heml设置浏览器版本
  2. [Java入门笔记] Java语言基础(五):数组
  3. Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
  4. Nginx 简单的负载均衡配置示例(转载)
  5. Hibernate关联关系配置(一对多、一对一和多对多)
  6. (九)play之yabe项目【发表博文】
  7. Web通信之:长轮询(long-polling)(转)
  8. NSArray使用小结
  9. C++暂时对象
  10. 简单封装常用js方法
  11. CodeChef Sereja and Game [DP 概率 博弈论]
  12. 路由信息对象Route之属性query和params的区别
  13. matlab从曲线图提取数据
  14. java 运行 .jar 文件乱码
  15. 第27月第6天 gcd timer
  16. SNMP基础知识
  17. [Nginx] – 性能优化 – 配置文件优化
  18. 【xsy2818】 最近点 动态树分治+可持久化线段树
  19. MSSQL批量写入数据方案
  20. Android sdk安装目录中没有platform-tools目录问题详解

热门文章

  1. (转)Redis 集群方案
  2. 插件笔记——dataTables使用说明
  3. uva439 - Knight Moves(BFS求最短路)
  4. lex&yacc8--wehter use in C++
  5. URL学习笔记
  6. Linux C 程序 指针数组和二级指针(TEN)
  7. grails导入excel
  8. Get code int value for different encoding
  9. IE=edge,chrome=1的META信息详解
  10. 使用 JSONP 实现跨域通信