一旦entity数据有所改变,将反映到数据库中。不能确认EntityManager何时会向数据库写入更新的数据。但是这一事件肯定会发生,一般是马上,但不会晚于EntityManager消失;)。你可以控制触发更新数据库:

em.flush();    

这将强制EntityManager 立刻将更新写入数据库。请记住,这条语句将影响所有状态为MANAGED的entitie,而不是当前一个。不过,一般情况下不必这么做。
    如果你想反其道而行之,也就是从数据库载入一个entity (因为别人可能已经修改其数据),这么写:

em.refresh(entity);    

怎样删除一个entity呢?很简单:

em.remove(entity);    

现在,entity的状态成为REMOVED,表示其已经被列入删除计划。你可以用flush()语句,让删除动作马上发生,但没必要这么干。

现在来点复杂的。当注入EntityManager 的时候,有一个事务范围持久上下文( Transaction Scoped Persistence Context)。当entitie处在MANAGED状态时,其处在持久上下文(persistence context )的“容器”中。“事务范围”意味什么?首先,什么是“事务”?

EJB3Stateful 和 Stateless beans (依同名标注辨别)的每个方法调用都包装到一个事务内。(顺便说一下,事务一旦发生RuntimeException,即发生会滚,对数据的改变将撤销)。因此,持久上下文(persistence context)将在调用方式之前建立,方式调用结束后移除。然后,持久上下文中管理的所有entity的状态成为 DETACHED。

假设在你的bean里头有两个method。第一个是load(), 它调用find函数取出数据库中的一个实体。第二个是finish(),返回一个JSF输出。调用这两个函数中间修改了实体数据。这种修改持久到数据库中吗?回答是:NO。

load() 函数结束后,EntityManager'的持久上下文结束,它所有管理过的entity状态成为DETACHED。一个后果是,与新entity相反-有一个ID,但他们的状态并不是managed ,对这些detached entities 所作的更新并不影响数据库。如果你想使一个entity 更新数据库,需要将其重新attach到持久上下文。在这个例子中,在finish()方法中增加以下行:

em.merge(entity);    

现在这个entity 已经合并到finish()方法的持久上下文中(记住,每个方法是一个事务,每个事物有自己的持久上下文),并且状态是又变为managed。

这样做是可以的,但有两个缺点:
-需要调用merge(->多了一些代码)
-调用find()之前,如果某个entity未初始化,而你又要存取它的某些属性,将会得到exception 错误。

有一个简单的解决方案:扩展持久上下文的生命期,这样,当调用多个事务/方法时,entity状态始终保持为managed 。因此,我们改变EntityManager的注入方式:

@PersistenceContext(type=PersistenceContextType.EXTENDED
private EntityManager em;   

现在,managed entities "生活在"一个扩展持久上下文中( Extended Persistence Context )。

你甚至无须呼叫merge()方法,因为eitities从未被DETACHED。你可能会问:普通事务范围( "normal" (transaction scoped) )持久上下文的好处是什么?它一直依附于你做的事情(小崔:什么意思?)。扩展上下文需要更多的内存,因为即使你不需要,它也一直存在于内存。并且一旦entities被其他的bean改变(它们有自己的持久上下文),你需要显式地调用refresh()方法(在overviews/list页面)。当你需要普通EntityManager 时它就在那里,因其生命周期短,只能操作即时数据;)
   
    当谈及列表:为取得不止一个实体,而是一个实体集合,使用:

List<Entity> entities = em.createQuery("from Entity").getResultList();    

这不是“真正”SQL,而是类似sql的东西,称之为EJBQL。你可以用它执行某些条件查询,排序等,如

..."from Entity where lastName=".nameToSearchFor." order by firstName"    

仅使用entity属性名称即可。关于EJBQL 要说的太多了,但对于本篇介绍来说这已足够。

好,基本介绍到此为止。希望对你来说,在如何使用EntityManager方面,这一个简单易懂的介绍。

我已声明过,不能保证百分百正确。并且肯定有许多英语语法错误(对不起,我是德国人,不要打我PP噢)。欢迎斧正。

2007.4.11翻译自:
http://www.jboss.com/index.html?module=bb&op=viewtopic&t=88460

转载于:https://www.cnblogs.com/cuibq/archive/2007/03/21/3802016.html

EntityManager:seam新手必读(二)相关推荐

  1. EntityManager:seam新手必读(一)

    开始学习seam的时候,有两个问题:我会用Spring和Hibernate,但一点也不懂Seam 和EJB3的 EntityManager.我用了一些时间学习seam,但EntityManager 一 ...

  2. 移动端IM开发者必读(二):史上最全移动弱网络优化方法总结

    1.前言 本文接上篇<移动端IM开发者必读(一):通俗易懂,理解移动网络的"弱"和"慢">,关于移动网络的主要特性,在上篇中已进行过详细地阐述,本文 ...

  3. [新手必读]论坛推广技巧

    [新手必读]论坛推广技巧 一.选择合适的论坛 论坛宣传首先要选择有自己潜在客户在的论坛:其次是要选择人气旺的论坛,但人气太旺也有弊病,因为贴子很快就被其它贴子淹没了,再说人太多,登录也困难:三是要选择 ...

  4. Python小白的数学建模课-01.新手必读

    Python 完全可以满足数学建模的需要. Python 是数学建模的最佳选择之一,而且在其它工作中也无所不能. 『Python小白的数学建模课 @ Youcans』 带你从数模小白成为国赛达人. 欢 ...

  5. 初入行Web前端开发新手必读

    公司招了几个刚毕业的学生,作为重构的新手让我来带. 首先感谢感谢党.感谢国家.感谢公司给了我这样的一个机会,对我工作的肯定和认可,让我带这样的一个重构团队,同时我也明白任务的艰巨,但我一定会将工作做好 ...

  6. android开发新浪微博客户端 完整攻略 [新手必读]

    android开发新浪微博客户端 完整攻略 [新手必读][转]2011-04-06  10:49:19 http://www.eoeandroid.com/forum-viewthread-tid-6 ...

  7. 九龙战登录只显示一个服务器,九龙战新手必读 带你走出六大误区

    原标题:九龙战新手必读 带你走出六大误区 腾讯第一动作手游九龙战开启了不删档测试,相信很多玩家已经感受到了来自小怪的压力吧?记得第一次玩的时候,连第一关都没打过去.那么今天小编就给大家介绍一些小知识小 ...

  8. 【小米刷机流程全攻略】新手必读

    http://www.xiaomi.cn/content-19-10673-1.html [小米刷机流程全攻略]新手必读 1. <新手刷机常识>刷机常用知识 2. 小米刷机的注意事项 3. ...

  9. 新手必读:笔记本电脑日常维护的经验技巧

    新手必读:笔记本电脑日常维护的经验技巧 来这里的兄弟,都是本本的用户了,有些人可能认为这篇文章写得有些多余,但是我想,也有好多朋友是初级用户了,有些才新买了新机器,或二手机器,刚拥有自己的小黑,如何正 ...

最新文章

  1. 设计model层的理念和思路
  2. 如何下载python2.7.16_CENTOS6.5 安装PYTHON2.7.16
  3. net4.0 程序没反应_笔记本触摸板没反应原因 笔记本触摸板没反应解决方法【详解】...
  4. PHP开源CMS介绍
  5. Property “pageNumber“ was accessed during render but is not defined on instance.
  6. 转:开源数据库中间件MyCat实现数据库读写分离、分表分库指南
  7. iOS CocoaPods:Updating local specs repositories一直停在那里了
  8. 加密 CryptoJS DES
  9. 微信php视频怎么变成mp4,缓存下来的视频如何变成mp4格式?
  10. Java关于Eclipse下载速度慢的解决办法!
  11. 用于视力恢复的脑机接口综述(一)
  12. 学计算机语言需要英语基础吗,数学和英语不好的人能学编程吗?
  13. hread first html5,(完整版)2017届上海市徐汇区高三英语二模卷(含听力文本和答案)...
  14. 设计师电脑之家赠送U盘版PE网络版WIN10系统安装版
  15. 05-用户和组以及权限
  16. 如何消除下一代Wi-Fi 6E设备的延迟
  17. 数据库的入门简单了解
  18. JAVA的基本数据类型以及数值范围
  19. JAVA手机软件程序JAR文件和JAD文件详解
  20. 还在直接用 JWT 做鉴权?JJWT 真香

热门文章

  1. 【实战】MPLS单域通信过程详解
  2. php获取excel表格内容,利用PHPExcel如何读取表格中内容
  3. Serverless Kubernetes 再升级 | 全新的网关能力增强
  4. 【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍
  5. 阿里云入选 2021 Gartner APM 魔力象限,国内唯一入选云厂商
  6. php麻将机器人ai算法,高性能麻将AI算法
  7. kaggle和colab入门
  8. 大学不挂科c语言题库及答案,C语言期末总复习,保你不挂科!
  9. delphi 纯虚函数的应用
  10. 编写五子棋程序时如何添加下棋时的音效_干货:如何提高编程能力