zoukankan      html  css  js  c++  java
  • 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. // 查询所有数据  
    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. }  

     


     

    [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. }
  • 相关阅读:
    麦卡姆轮运动原理
    ESP32开发(2)esp32-cam采集图像
    ESP32开发(1)环境配置
    Cesium学习笔记2-3:视频投影
    Cesium中实时显示经纬度及视角高
    Cesium学习笔记2-5:内部使用阳历扩展
    Cesium学习笔记2-4:外部扩展
    Cesium学习笔记2-4:更多官方示例
    win10通过wifi分享上网
    更换源地址
  • 原文地址:https://www.cnblogs.com/zl520/p/10546281.html
Copyright © 2011-2022 走看看