我想知道在 Hibernate/JPA 世界中处理数据表的正确方法是什么。据我所知,以下三个选择之一是导致整个纸牌屋分崩离析,但我不知道哪个是错误的。
- 通过自定义 JSF PhaseListener 进行半自动事务和 EntityManager 处理,该 PhaseListener 围绕每个请求开始并提交事务
- 将编辑组件放入数据表中
- 使用从请求范围的 EntityManager 获取数据的请求范围的托管 bean(在 PrettyFaces 的帮助下从其 URL 中设置请求范围的 bean 的 ID)
- 使用请求范围的 bean 而不是视图或会话范围的 bean 支持 dataTable。
我看到一个使用 JPA 的 ICEfaces dataTable 演示,但它们都是手动管理事务并且默认情况下不显示编辑组件。您单击导致对象被提名为可编辑的行,然后当您点击“保存”时,它会在手动触发保存之前手动将对象重新连接到新的 EntityManager。我认为这里的点击编辑功能为我们提供了一种方法来确保将正确的对象重新附加到当前会话,我不知道如果没有类似的东西将如何生活。
我对新的 ICEfaces 3.0 ace:dataTable (née PrimeFaces 2.0 dataTable) 的印象是它旨在用于视图或会话范围的 bean,但我不明白如何绕过 StaleObjectState和/或 LazyInitializationExceptions,如果一个模型对象从请求 A 和 EntityManager A 中的 DAO 出来,然后被请求 B 和 EntityManager B 修改或分页。
我想它可能通过某种深度的 fu 在 Java EE 下工作,但我现在没有将我们从 Tomcat 6 升级到更高级的东西的奢侈(尽管从长远来看这是我的意图)。我们也不打算开始使用 Spring 或 Seam 或任何其他很酷的东西。ICEfaces 对我们来说已经够奇怪了,说实话可能太奇怪了。
综上所述,这些中哪个是错误的选择?请求范围的实体管理器、请求范围的数据表还是在数据表中使用编辑组件?还是这里真的有其他问题?