java entitymanager类_EntityManager方法简介
发布日期:2021-10-27 11:20:23 浏览次数:17 分类:技术文章

本文共 9984 字,大约阅读时间需要 33 分钟。

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

@PersistenceContext(unitName="foshanshop")

EntityManager em;

//得到实体管理器

privateEntityManager getEntityManager() {returnEntityManagerHelper.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 voidsave(Role entity) {3 try{4 EntityManagerHelper.beginTransaction();5 getEntityManager().persist(entity);6 EntityManagerHelper.commit();7 } catch(RuntimeException re) {8 EntityManagerHelper.rollback();9 throwre;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 publicRole update(Role entity) {3 try{4 EntityManagerHelper.beginTransaction();5 Role result =getEntityManager().merge(entity);6 EntityManagerHelper.commit();7 returnresult;8 } catch(RuntimeException re) {9 EntityManagerHelper.rollback();10 throwre;11 }12 }

5.Remove() :

删除对象

1 //删除数据

2 public voiddelete(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 throwre;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 publicRole findById(Integer id) {3 try{4 Role instance = getEntityManager().find(Role.class, id);5 returninstance;6 } catch(RuntimeException re) {7 throwre;8 }9 }10

11 //查询所有数据

12 @SuppressWarnings("unchecked")13 public ListfindAll() {14 try{15 final String queryString = "select model from Role model";16 Query query =getEntityManager().createQuery(queryString).setHint(17 "toplink.refresh", true);18 returnquery.getResultList();19 } catch(RuntimeException re) {20 throwre;21 }22 }

1 public classEntityManagerHelper {2 //实体化私有静态实体管理器变量emf

3 privatestaticfinal EntityManagerFactory emf;4 //实体化私有静态本地线程变量threadLocal

5 private staticfinal ThreadLocalthreadLocal;6 //用来给两个变量赋初值的静态块

7 static{8 emf = Persistence.createEntityManagerFactory("lamsPU");9 threadLocal = new ThreadLocal();10 }11 //得到实体管理器的方法

12 public staticEntityManager getEntityManager() {13 EntityManager manager =threadLocal.get();14 if (manager == null || !manager.isOpen()) {15 manager =emf.createEntityManager();16 threadLocal.set(manager);17 }18 returnmanager;19 }20 //关闭实体管理器的方法

21 publicstaticvoid closeEntityManager() {22 EntityManager em =threadLocal.get();23 threadLocal.set(null);24 if (em != null)25 em.close();26 }27 //开始事务的方法

28 publicstaticvoid beginTransaction() {29 getEntityManager().getTransaction().begin();30 }31 //提交事务的方法

32 publicstaticvoid commit() {33 getEntityManager().getTransaction().commit();34 }35 //回滚事务的方法

36 publicstaticvoid rollback() {37 getEntityManager().getTransaction().rollback();38 }39 //生成查找的方法

40 public staticQuery createQuery(String query) {41 returngetEntityManager().createQuery(query);42 }43 publicstaticvoid log(String string, Level info, Object object)44 {45 //TODO Auto-generated method stub

46 }47 }

find(*.class,ID) :若实体Bean不存在,则返回null

getReference(*,class,ID) :

若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证实体Bean 已被初始化

1.Entity的获取:

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

2.persist() :

添加实体Bean

// 新增数据

publicvoidsave(Role entity) {

try{

EntityManagerHelper.beginTransaction();

getEntityManager().persist(entity);

EntityManagerHelper.commit();

} catch(RuntimeException re) {

EntityManagerHelper.rollback();

throwre;

}

}

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

// 修改数据

publicRole update(Role entity) {

try{

EntityManagerHelper.beginTransaction();

Role result = getEntityManager().merge(entity);

EntityManagerHelper.commit();

returnresult;

} catch(RuntimeException re) {

EntityManagerHelper.rollback();

throwre;

}

}

5.Remove() :

删除对象

// 删除数据

publicvoiddelete(Role entity) {

try{

EntityManagerHelper.beginTransaction();

entity = getEntityManager()

.getReference(Role.class, entity.getId());

getEntityManager().remove(entity);

EntityManagerHelper.commit();

} catch(RuntimeException re) {

EntityManagerHelper.rollback();

throwre;

}

}

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],但这样做不适合程序移植

// 通过id查询数据

publicRole findById(Integer id) {

try{

Role instance = getEntityManager().find(Role.class, id);

returninstance;

} catch(RuntimeException re) {

throwre;

}

}

// 查询所有数据

@SuppressWarnings("unchecked")

publicList findAll() {

try{

finalString queryString ="select model from Role model";

Query query = getEntityManager().createQuery(queryString).setHint(

"toplink.refresh",true);

returnquery.getResultList();

} catch(RuntimeException re) {

throwre;

}

}

publicclassEntityManagerHelper {

// 实体化私有静态实体管理器变量emf

privatestaticfinalEntityManagerFactory emf;

// 实体化私有静态本地线程变量threadLocal

privatestaticfinalThreadLocal threadLocal;

// 用来给两个变量赋初值的静态块

static{

emf = Persistence.createEntityManagerFactory("lamsPU");

threadLocal = newThreadLocal();

}

// 得到实体管理器的方法

publicstaticEntityManager getEntityManager() {

EntityManager manager = threadLocal.get();

if(manager ==null|| !manager.isOpen()) {

manager = emf.createEntityManager();

threadLocal.set(manager);

}

returnmanager;

}

// 关闭实体管理器的方法

publicstaticvoidcloseEntityManager() {

EntityManager em = threadLocal.get();

threadLocal.set(null);

if(em !=null)

em.close();

}

// 开始事务的方法

publicstaticvoidbeginTransaction() {

getEntityManager().getTransaction().begin();

}

// 提交事务的方法

publicstaticvoidcommit() {

getEntityManager().getTransaction().commit();

}

// 回滚事务的方法

publicstaticvoidrollback() {

getEntityManager().getTransaction().rollback();

}

// 生成查找的方法

publicstaticQuery createQuery(String query) {

returngetEntityManager().createQuery(query);

}

publicstaticvoidlog(String string, Level info, Object object)

{

// TODO Auto-generated method stub

}

}

转载地址:https://blog.csdn.net/weixin_34518190/article/details/114872489 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:java棋盘覆盖分治法_算法java实现--分治法--棋盘覆盖问题
下一篇:Java中输入刘流输出流_Java IO学习笔记(JDK1.5)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月15日 04时05分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章