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.Entity的获取:
注意:若*.class不是Entity Bean的话,都会引发IllegalArgumentException
2.persist() :
添加实体Bean
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
5.Remove() :
删除对象
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