2012-02-14 80 views
3

我想知道什么是处理在Hibernate/JPA世界中输入数据表的正确方法。据我所知,以下三种选择中的一种导致整个卡片房子崩溃,但我不知道哪一个是错的。将ice/ace:dataTable与JPA和请求范围bean集成

  • 半自动交易和EntityManager的通过自定义JSF PhaseListener在开始和提交周围的每一个请求
  • 把里面的DataTable
  • 编辑组件使用请求范围的托管bean是从获取他们的数据事务处理请求范围的EntityManager(在PrettyFaces的帮助下,通过URL的请求范围bean设置ID)
  • 使用请求范围的bean而不是视图或会话范围的bean来备份dataTable。

我看到an ICEfaces dataTable demo using JPA但它们都是手动管理事务并且默认情况下不显示编辑组件。您单击导致对象被提名为可编辑性的行,然后当您点击“保存”时,手动将对象重新连接到新的EntityManager,然后手动触发保存。我在这里看到了点击编辑功能,它为我们提供了一种方法来确保将正确的对象重新附加到当前会话中,并且我不知道如果没有类似的东西,我们将如何生活。我得到的关于新的ICEfaces 3.0 ace:dataTable(néePrimeFaces 2.0 dataTable)的印象是,它打算用在视图或会话范围的bean中,但我看不到如何可以绕过StaleObjectState和/或LazyInitializationExceptions,如果有一个模型对象从请求A和EntityManager A中的DAO出来,然后通过请求B与EntityManager B进行修改或分页。

我想它可能在Java EE通过某种深厚的功夫,但我没有把我们从Tomcat 6升级到任何更漂亮的东西的奢望(尽管这是我长期的目的)。我们也不会开始使用Spring或Seam或其他很酷的东西。 ICEfaces对我们来说足够怪异,老实说可能太奇怪了。

那么总结一下,哪个是错误的选择?请求范围的实体管理器,请求范围的数据表或使用dataTable中的编辑组件?或者在这里有其他问题呢?

回答

4

如果你问我,当你的需求似乎尖叫一些更有趣的东西时,最重要的错误似乎是坚持一个几乎裸露的雄猫。当你不需要“所有那些其他的东西”时,通常你会使用Tomcat,所以当你需要时,为什么要继续使用Tomcat?

这就是说,模式真的不是那么难。

  • 有一个视图作用域确定辅助bean
  • 获取初始数据在@PostConstruct - (当有喜欢的ID没有参数)或PreRenderViewEvent方法结合视图参数
  • 使用使用一个单独的服务的类实体管理器获取和保存数据
  • 使实体管理器“交易范围的”
    • 没有EJB/CDI /春:
      • 从实体管理器工厂为每个操作获取新的实体管理器。
      • 启动一个(资源本地)事务,执行操作,提交事务,关闭实体管理器。
  • 返回直接从您的支持bean实体的名单,绑定表的编辑模式输入字段的实体的相应属性。
  • 更新单行时,将相应的实体传递给您的服务的更新方法。除了获得实体经理,开始交易等的开销之外,这基本上只在实体经理上调用merge()

意识到在您使用detached entities的服务之外的所有时间。因此没有任何LazyInitializationExceptions的风险。支持bean需要在视图范围内,以便JSF更新正确的(detached!)实体,然后您自己的代码将其传递给服务,该服务将其合并到持久性上下文中。

用于持久化的流程是这样的:

 
View state    View scope  Transaction scoped PC 
Facelet/components  Backing Bean  Service 
     Strings ------> Detached entities --> Attached entities 

(获取数据流是完全相反的)

创建服务这种方式有点繁琐,一种受虐狂的运动虽然。对于示例应用程序以及上面讨论的两种方法(获取和更新),它不会太糟糕,但对于任何大型应用程序而言,这将很快失去控制。

如果您已经将JSF和JPA添加到Tomcat,只需帮助自己并使用类似TomEE的东西。这比Tomcat(25MB vs 7MB)稍大一些,包含了所有你想要避免但实际上仍然需要的东西。

如果您绝对无法升级您的Tomcat安装(例如产品所有者或经理认为他拥有服务器而不是开发人员),那么您可能想要投资学习CDI。这可以很容易地添加到你的战争(只是一个额外的jar),让你把很多繁琐的代码抽象出来。你也可以真正使用的一件事是JTA提供者。这也可以单独添加到您的战争中,但您添加的这些东西越多,使用TomEE(或GlassFish,Resin,JBoss等替代品)就会越好。

也看到这篇文章,它涵盖你的需求各部分:Communication in JSF 2.0

+0

感谢您详细的解答。如果我有我的druthers,我们将升级到Glassfish;我已经获得了一些我们的应用程序,可以在它下面成功加载,但没有任何东西可以在TomEE下实际运行。我完全同意你对情况的分析,我只是没有强迫组织在这个时候做我想做的事。不过,我想我可以运用你的建议并找到前进的方向。再次感谢! – 2012-02-19 16:29:33

+1

@DanielLyons为了我们的利益(我在TomEE上工作),你能否提供一些有关TomEE在dev(at)openejb.apache.org上遇到的问题的细节。我们是一个年轻的服务器,我们确实需要所有我们可以获得的反馈。 – 2012-02-19 22:02:40

+0

本周晚些时候我会告诉你一些细节。我认为困难是由于它是一个测试版。 – 2012-02-19 23:21:24