似乎有两种模式来实现跨越多个http请求与JPA的业务事务:
>具有分离实体的实体管理器每请求 >扩展的持久性上下文
这些模式的各自优点是什么?什么时候应该是首选?
到目前为止,我想出了:
>扩展的持久性上下文保证对象标识等同于数据库标识,简化编程模型,并潜在地破坏实现实体的等同性的需要 分离的实体比扩展持久性上下文需要更少的内存,因为持久性上下文还必须存储用于更改检测的实体的先前状态 >不再引用分离的实体有资格进行垃圾收集;必须首先明确分离持久对象
但是,没有JPA的实践经验,我相信我错过了一些重要的事情,所以这个问题.
如果重要:我们打算使用由Hibernate 3.6支持的JPA 2.0.
编辑:我们的视图技术是JSF 2.0,在一个EJB 3.1容器中,具有CDI和可能的Seam 3.
解决方法
那么我可以通过尝试在Web环境中使用扩展的持久性上下文来枚举挑战.有些事情也取决于你的观点技术是什么,如果它是绑定实体或视图级中间人.
>实体管理器不是线程安全的. 每个用户会话不需要一个. 每个用户会话需要一个 浏览器标签. >当一个异常出来的时候 EntityManager,它被考虑 无效并需要关闭 更换.如果你打算 编写自己的框架扩展 为了管理延长的生命周期, 这需要实施 有防弹一般在 EM-per-request设置异常 去一些错误页面和 然后加载下一页创建一个 不管怎么说,总是会这样的 有. >对象的平等不会是 100%自动安全.如上, 一个例外可能无效 上下文一个加载的对象 被关联,所以一个取 现在不会平等做到这一点 假设也假设非常 高水平的技能和 了解JPA的工作原理和 什么是EM 开发者使用它.例如., 意外地使用合并时 不需要会返回一个新的 不满足==的对象 其领域相同 前任. (治疗合并一样 SQL’update’是非常常见的 JPA noobie’error’特别 因为它只是一个不起作用的大部分 那么它滑过去的时间.) >如果您使用视图技术 其结合POJO(例如SpringMVC) 你打算绑定网络表单 数据直接发送到您的实体, 你会很快遇到麻烦. 对附加实体的更改将会 在下一个持续下去 flush / commit,不管是否 他们在交易中完成 不.常见的错误是,web表单 进入并绑定一些无效数据 在一个实体上,验证失败 trys返回屏幕通知 用户.建筑错误屏幕 涉及运行查询.询问 触发刷新/提交持久性 上下文.更改绑定到附件 实体被刷新到数据库, 希望引起SQL异常,但是 也许只是坚持腐败的数据.
(当然,如果编程很匆忙,问题4当然也会发生在会话中,但你不会被迫积极地努力避免.)
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|