EntityManager方法简介

EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext 注释由EJB 容器动态注入,例:

@PersistenceContext(unitName="foshanshop")
EntityManager em;

  

// 得到实体管理器
private EntityManager getEntityManager() {
return EntityManagerHelper.getEntityManager();
}

EntityManager常用方法:

find(*.class,ID) :若实体Bean不存在,则返回null
getReference(*,class,ID) :
若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证实体Bean 已被初始化

1.Entity的获取:注意:若*.class不是Entity Bean的话,都会引发IllegalArgumentException

2.persist() :

添加实体Bean

 1 // 新增数据
 2 public void save(Role entity) {
 3 try {
 4 EntityManagerHelper.beginTransaction();
 5 getEntityManager().persist(entity);
 6 EntityManagerHelper.commit();
 7 } catch (RuntimeException re) {
 8 EntityManagerHelper.rollback();
 9 throw re;
10 }
11 }

3.更新实体Bean :

当实体正在被容器管理时,你可以调用实体的set 方法对数据进行修改,在容器决定flush 时,更新的数据才会同步到数据库。如果你希望修改后的数据实时同步到数据库,你可以执行EntityManager.flush()方法。

4.merge () :

是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定flush 时,数据将会同步到数据库中,执行em.merge(Object obj)方法时,容器的工作规则:

(1).如果此时容器中已经存在一个受容器管理的具有相同ID 的Object实例,容器将会把参数obj的内容拷贝进这个受管理的实例,merge()方法返回受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。

(2).容器中不存在具有相同ID 的Object实例。容器根据传进的obj参数Copy 出一个受容器管理的Object实例,同时merge()方法会返回出这个受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把 实例同步到数据库中。如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException

 1 // 修改数据
 2 public Role update(Role entity) {
 3 try {
 4 EntityManagerHelper.beginTransaction();
 5 Role result = getEntityManager().merge(entity);
 6 EntityManagerHelper.commit();
 7 return result;
 8 } catch (RuntimeException re) {
 9 EntityManagerHelper.rollback();
10 throw re;
11 }
12 }

5.Remove() :

删除对象

 1 // 删除数据
 2 public void delete(Role entity) {
 3 try {
 4 EntityManagerHelper.beginTransaction();
 5 entity = getEntityManager()
 6 .getReference(Role.class, entity.getId());
 7 getEntityManager().remove(entity);
 8 EntityManagerHelper.commit();
 9 } catch (RuntimeException re) {
10 EntityManagerHelper.rollback();
11 throw re;
12 }
13 }

6.createQuery()

返回Query对象,以执行JPQL语句



7.createNativeQuery()

返回Query对象,以执行SQL语句



8.refresh()

刷新实体Bean,以得到对新对象 (幽雅的获取最新对象方法)



9.contains()

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



10.clear()

分离所有当前正在被管理的实体在处理大量实体的时候,如果你不把已经处理过的实体从EntityManager 中分离出来,将会消耗你大量的内存。调用EntityManager 的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。

有一点需要说明下,在事务没有提交前(事务默认在调用堆栈的最后提交,如:方法的返回),如果调用clear()方法,之前对实体所作的任何改变将会掉失,所以建议你在调用clear()方法之前先调用flush()方法保存更改



11. flush()

将实体的改变立刻刷新到数据库中

当实体管理器对象在一个session bean 中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时提交并且同步它的内容。在一个session bean 中,服务器的事务默认地会在调用堆栈的最后提交(如:方法的返回)

12.javax.persistence.FlushModeType 实体Bean管理器的Flush模式

FlushModeType.COMMIT :刷新只有在事务提交时才发生,使用场合:在大量更新数据的过程中存在查询语句(除了find()和getreference()查询)的执行

FlushModeType.AUTO :(默认模式)刷新在查询语句执行前(除了find()和getreference()查询)或事务提交时才发 生,使用场合:在大量更新数据的过程中没有任何查询语句(除了find()和getreference()查询)的执行。

JDBC 驱动跟数据库交互的次数。JDBC 性能最大的增进是减少JDBC 驱动与数据库之间的网络通讯FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互(触发了多少次Flush 就产生了多少次网络交互)

设置:entityManager.setFlushMode(FlushModeType.COMMIT);



13.getDelegate( )

获取持久化实现者的引用

用过getDelegate( )方法,你可以获取EntityManager 持久化实现者的引用,如Jboss EJB3 的持久化产品采用Hibernate,可以通过getDelegate( ) 方法获取对他的访问,如:

@PersistenceContext

protected EntityManager em;

HibernateEntityManager manager = (HibernateEntityManager)em.getDelegate();

获得对Hibernate 的引用后,可以直接面对Hibernate 进行编码,不过这种方法并不可取,强烈建议不要使用.在Weblogic 中,你也可以通过此方法获取对Kodo 的访问

另:映射的表名或列名与数据库保留字同名时的处理

将表名加标式符,例如:在Mysql下,用‘order‘,或在sqlserver下用[TableName],但这样做不适合程序移植

 1 // 通过id查询数据
 2 public Role findById(Integer id) {
 3     try {
 4         Role instance = getEntityManager().find(Role.class, id);
 5         return instance;
 6     } catch (RuntimeException re) {
 7         throw re;
 8     }
 9 }
10
11 // 查询所有数据
12 @SuppressWarnings("unchecked")
13 public List<Role> findAll() {
14     try {
15         final String queryString = "select model from Role model";
16         Query query = getEntityManager().createQuery(queryString).setHint(
17                 "toplink.refresh", true);
18         return query.getResultList();
19     } catch (RuntimeException re) {
20         throw re;
21     }
22 }  
 1 public class EntityManagerHelper {
 2 // 实体化私有静态实体管理器变量emf
 3 private staticfinal EntityManagerFactory emf;
 4 // 实体化私有静态本地线程变量threadLocal
 5 private staticfinal ThreadLocal<EntityManager> threadLocal;
 6 // 用来给两个变量赋初值的静态块
 7 static {
 8 emf = Persistence.createEntityManagerFactory("lamsPU");
 9 threadLocal = new ThreadLocal<EntityManager>();
10 }
11 // 得到实体管理器的方法
12 public static EntityManager getEntityManager() {
13 EntityManager manager = threadLocal.get();
14 if (manager == null || !manager.isOpen()) {
15 manager = emf.createEntityManager();
16 threadLocal.set(manager);
17 }
18 return manager;
19 }
20 // 关闭实体管理器的方法
21 public staticvoid closeEntityManager() {
22 EntityManager em = threadLocal.get();
23 threadLocal.set(null);
24 if (em != null)
25 em.close();
26 }
27 // 开始事务的方法
28 public staticvoid beginTransaction() {
29 getEntityManager().getTransaction().begin();
30 }
31 // 提交事务的方法
32 public staticvoid commit() {
33 getEntityManager().getTransaction().commit();
34 }
35 // 回滚事务的方法
36 public staticvoid rollback() {
37 getEntityManager().getTransaction().rollback();
38 }
39 // 生成查找的方法
40 public static Query createQuery(String query) {
41 return getEntityManager().createQuery(query);
42 }
43 public staticvoid log(String string, Level info, Object object)
44 {
45 // TODO Auto-generated method stub
46 }
47 }
  1. find(*.class,ID) :若实体Bean不存在,则返回null
  2. getReference(*,class,ID) :
  3. 若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证实体Bean 已被初始化


1.Entity的获取:

注意:若*.class不是Entity Bean的话,都会引发IllegalArgumentException

2.persist() :

添加实体Bean

[java] view plaincopy

  1. // 新增数据
  2. public void save(Role entity) {
  3. try {
  4. EntityManagerHelper.beginTransaction();
  5. getEntityManager().persist(entity);
  6. EntityManagerHelper.commit();
  7. } catch (RuntimeException re) {
  8. EntityManagerHelper.rollback();
  9. throw re;
  10. }
  11. }


3.更新实体Bean :

当实体正在被容器管理时,你可以调用实体的set 方法对数据进行修改,在容器决定flush 时,更新的数据才会同步到数据库。如果你希望修改后的数据实时同步到数据库,你可以执行EntityManager.flush()方法。



4.merge () :

是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定flush 时,数据将会同步到数据库中,执行em.merge(Object obj)方法时,容器的工作规则:

(1).如果此时容器中已经存在一个受容器管理的具有相同ID 的Object实例,容器将会把参数obj的内容拷贝进这个受管理的实例,merge()方法返回受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。

(2).容器中不存在具有相同ID 的Object实例。容器根据传进的obj参数Copy 出一个受容器管理的Object实例,同时merge()方法会返回出这个受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把 实例同步到数据库中。如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException

[java] view plaincopy

  1. // 修改数据
  2. public Role update(Role entity) {
  3. try {
  4. EntityManagerHelper.beginTransaction();
  5. Role result = getEntityManager().merge(entity);
  6. EntityManagerHelper.commit();
  7. return result;
  8. } catch (RuntimeException re) {
  9. EntityManagerHelper.rollback();
  10. throw re;
  11. }
  12. }


5.Remove() :

删除对象

[java] view plaincopy

  1. // 删除数据
  2. public void delete(Role entity) {
  3. try {
  4. EntityManagerHelper.beginTransaction();
  5. entity = getEntityManager()
  6. .getReference(Role.class, entity.getId());
  7. getEntityManager().remove(entity);
  8. EntityManagerHelper.commit();
  9. } catch (RuntimeException re) {
  10. EntityManagerHelper.rollback();
  11. throw re;
  12. }
  13. }


6.createQuery()

返回Query对象,以执行JPQL语句



7.createNativeQuery()

返回Query对象,以执行SQL语句



8.refresh()

刷新实体Bean,以得到对新对象 (幽雅的获取最新对象方法)



9.contains()

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



10.clear()

分离所有当前正在被管理的实体在处理大量实体的时候,如果你不把已经处理过的实体从EntityManager 中分离出来,将会消耗你大量的内存。调用EntityManager 的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。

有一点需要说明下,在事务没有提交前(事务默认在调用堆栈的最后提交,如:方法的返回),如果调用clear()方法,之前对实体所作的任何改变将会掉失,所以建议你在调用clear()方法之前先调用flush()方法保存更改



11. flush()

将实体的改变立刻刷新到数据库中

当实体管理器对象在一个session bean 中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时提交并且同步它的内容。在一个session bean 中,服务器的事务默认地会在调用堆栈的最后提交(如:方法的返回)

12.javax.persistence.FlushModeType 实体Bean管理器的Flush模式

FlushModeType.COMMIT :刷新只有在事务提交时才发生,使用场合:在大量更新数据的过程中存在查询语句(除了find()和getreference()查询)的执行

FlushModeType.AUTO :(默认模式)刷新在查询语句执行前(除了find()和getreference()查询)或事务提交时才发 生,使用场合:在大量更新数据的过程中没有任何查询语句(除了find()和getreference()查询)的执行。

JDBC 驱动跟数据库交互的次数。JDBC 性能最大的增进是减少JDBC 驱动与数据库之间的网络通讯FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互(触发了多少次Flush 就产生了多少次网络交互)

设置:entityManager.setFlushMode(FlushModeType.COMMIT);



13.getDelegate( )

获取持久化实现者的引用

用过getDelegate( )方法,你可以获取EntityManager 持久化实现者的引用,如Jboss EJB3 的持久化产品采用Hibernate,可以通过getDelegate( ) 方法获取对他的访问,如:

@PersistenceContext

protected EntityManager em;

HibernateEntityManager manager = (HibernateEntityManager)em.getDelegate();

获得对Hibernate 的引用后,可以直接面对Hibernate 进行编码,不过这种方法并不可取,强烈建议不要使用.在Weblogic 中,你也可以通过此方法获取对Kodo 的访问

另:映射的表名或列名与数据库保留字同名时的处理

将表名加标式符,例如:在Mysql下,用‘order‘,或在sqlserver下用[TableName],但这样做不适合程序移植



[java] view plain copy

print?

  1. // 通过id查询数据
  2. public Role findById(Integer id) {
  3. try {
  4. Role instance = getEntityManager().find(Role.class, id);
  5. return instance;
  6. } catch (RuntimeException re) {
  7. throw re;
  8. }
  9. }
  10. // 查询所有数据
  11. @SuppressWarnings("unchecked")
  12. public List<Role> findAll() {
  13. try {
  14. final String queryString = "select model from Role model";
  15. Query query = getEntityManager().createQuery(queryString).setHint(
  16. "toplink.refresh", true);
  17. return query.getResultList();
  18. } catch (RuntimeException re) {
  19. throw re;
  20. }
  21. }

[java] view plaincopy

  1. public class EntityManagerHelper {
  2. // 实体化私有静态实体管理器变量emf
  3. private staticfinal EntityManagerFactory emf;
  4. // 实体化私有静态本地线程变量threadLocal
  5. private staticfinal ThreadLocal<EntityManager> threadLocal;
  6. // 用来给两个变量赋初值的静态块
  7. static {
  8. emf = Persistence.createEntityManagerFactory("lamsPU");
  9. threadLocal = new ThreadLocal<EntityManager>();
  10. }
  11. // 得到实体管理器的方法
  12. public static EntityManager getEntityManager() {
  13. EntityManager manager = threadLocal.get();
  14. if (manager == null || !manager.isOpen()) {
  15. manager = emf.createEntityManager();
  16. threadLocal.set(manager);
  17. }
  18. return manager;
  19. }
  20. // 关闭实体管理器的方法
  21. public staticvoid closeEntityManager() {
  22. EntityManager em = threadLocal.get();
  23. threadLocal.set(null);
  24. if (em != null)
  25. em.close();
  26. }
  27. // 开始事务的方法
  28. public staticvoid beginTransaction() {
  29. getEntityManager().getTransaction().begin();
  30. }
  31. // 提交事务的方法
  32. public staticvoid commit() {
  33. getEntityManager().getTransaction().commit();
  34. }
  35. // 回滚事务的方法
  36. public staticvoid rollback() {
  37. getEntityManager().getTransaction().rollback();
  38. }
  39. // 生成查找的方法
  40. public static Query createQuery(String query) {
  41. return getEntityManager().createQuery(query);
  42. }
  43. public staticvoid log(String string, Level info, Object object)
  44. {
  45. // TODO Auto-generated method stub
  46. }
  47. }

原文地址:https://www.cnblogs.com/zl520/p/10546281.html

时间: 2024-08-08 10:11:47

EntityManager方法简介的相关文章

C#——Marshal.StructureToPtr方法简介

目录 MarshalStructureToPtr方法简介 功能及位置 语法 参数说明 异常 备注 举例 本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一.小鱼)相关研究.学习内容所做的笔记,欢 迎广大朋友指正! 具体可以参考http://msdn.microsoft.com. Marshal.StructureToPtr方法简介 1. 功能及位置 将数据从托管对象封送到非托管内存块,属于.NET Framework 类库命名空间:System.

Datatable的Select()方法简介

DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的重载,分别是 Select() Select(string filterExpression) Select(string filterExpression, string sort) Select(string filterExpression,string sort, DataViewRowSt

$.getJSON( )的使用方法简介

JSON(JavaScript Object Notation)即JavaScript对象表示法,是一种轻量级的数据交换格式.它非常便于编程人员对数据的处理,也便于机器对数据的解析和生成,应用非常广泛. json文件可以保存为"test.json"这样的文件,json数据的一般格式如下("{ }"中的为对象,"[ ]"中的为数组): {"total":3,"rows":[{"userId"

Level Set方法简介

originate from: http://www.cnblogs.com/tabatabaye/articles/891232.html Level Set方法简介: Level Set方法是由Sethian和Osher于1988年提出,最近十几年得到广泛的推广与应用.简单的说来,Level Set方法把低维的一些计算上升到更高一维,把N维的描述看成是N+1维的一个水平.举个例子来说,一个二维平面的圆,如x^2+y^2=1可以看成是二元函数f(x,y)=x^2+y^2的1水平,因此,计算这个

iOS中常用的四种数据持久化方法简介

iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了 @interface User : NSObject <NSCoding>@property (nonatomic, assign) NSInteger userID;@property (nonatomic,

苍狼敏捷需求用例分析方法简介并讲义下载

作者:张克强    作者微博:张克强-敏捷307 用例分析方法已经有不短的历史,发展出了多种用例分析方法.笔者花费了大量时间,对用例分析的各个方面进行实践和分析,得到如下系列文章: 需求用例分析之一:异常流 需求用例分析之二:级别设置需求用例分析之三:补充规约 需求用例分析之四:业务规则 需求用例分析之五:业务用例之Rational系 需求用例分析之六:业务用例之科伯恩系 需求用例分析之七:业务用例之小结 需求用例分析之八:用例颗粒度 在这些分析的基础上与及笔者的实践,总结整理得到"苍狼敏捷需求

ATAM 方法简介

ATAM  方法简介 1.ATAM 是啥 ATAM 是一种基于场景评估方式,英文全称 Architecture TradeOff Analysis Method ATAM(架构权衡分析法) 2.ATAM评估方法 ATAM 方法对软件架构进行评估的目的主要是 根据系统质量属性和业务需求评估决策结果,ATAM希望揭示出架构满足质量目标,架构设计者能够更清楚的认识到质量目标之间的联系.即如何权衡多个目标 3.ATAM的参与者 开发人员,领域专家,测试人员,客户代表,用户等 4.如何展开评估活动 这里将

xtrabackup使用方法简介

关于xtrabackup的简介就不再赘述,百度一堆,使用方法也说明也很多.感觉还是只有自己试过之后才能有更深刻的认识,以下的使用说明基于官方文档及自己试验过程,记录下备查. 安装: 去percona-xtrabackup官网上下载,有rpm包.tar包,也有解压直接可用的二进制包.我试验采用的二进制包. 由于里面的innobackupx命令实际上是用perl语言封装了xtrabackupx而成,所以使用innobackupx命令要先检查perl包以及其依赖包的安装情况. 可以执行yum inst

delphi fastMM 使用方法简介

delphi fastMM 使用方法简介 在 http://sourceforge.net/projects/fastmm 中可以下载到最新 stable 的 FastMM,当前推荐的是 4.62,主要特点包括: 1.彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器("取代"就是第一个 uses FastMM4,that is all ...) 2.实现了内存管理器共享机制,Exe 和 Dll 间共享内存管理器不需要任何 Dll 支持 3.集成了内存泄漏检测功能