将ice / ace:dataTable与JPA和请求范围的bean集成

时间:2012-02-14 23:27:36

标签: jsf-2 icefaces-2

我想知道处理在Hibernate / JPA世界中输入的dataTable的正确方法是什么。据我所知,以下三种选择中的一种导致整个纸牌屋分崩离析,但我不知道哪一个是错的。

  • 半自动事务和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éePrimeFaces2.0 dataTable)是打算在View或Session-scoped bean中使用,但我不知道怎么可能如果有一个模型对象来自请求A和EntityManager A中的DAO,然后被请求B使用EntityManager B进行修改或分页,则可以解决StaleObjectState和/或LazyInitializationExceptions。

我认为它可以通过某种深层次的功能在Java EE下工作,但是我没有把我们从Tomcat 6升级到任何更高级的东西(尽管从长远来看这是我的意图)。我们也不打算开始使用Spring或Seam或其他很酷的东西。 ICEfaces对我们来说太奇怪了,老实说可能太奇怪了。

总结一下,哪一个是错误的选择?请求范围的实体管理器,请求范围的dataTable或在dataTable中使用编辑组件?或者其他地方真的有问题吗?

1 个答案:

答案 0 :(得分:4)

如果你问我,当你的要求似乎为一些有点发烧友的东西尖叫时,主要的错误似乎是坚持几乎裸露的Tomcat。通常情况下,当你不需要“所有那些其他东西”时你使用Tomcat,所以当你需要它时,为什么要继续使用一个裸Tomcat?

那就是说,这种模式并不那么困难。

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

了解您在服务之外始终与detached entities合作。因此,任何LazyInitializationExceptions都没有风险。支持bean需要在视图范围内,以便JSF更新正确的(分离的!)实体,然后您自己的代码将其传递给服务,该服务将其合并到持久性上下文中。

坚持的流程是:

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

(获取数据的流程正好相反)

以这种方式创建服务虽然有点乏味,但却是一种受虐狂的练习。对于一个示例应用程序和上面讨论的两种方法(获取和更新),它不会那么糟糕,但对于任何大小的应用程序,这将很快失控。

如果您已经将JSF和JPA添加到Tomcat,那么请帮自己一个忙,并使用类似TomEE的内容。这几乎不比Tomcat大(25MB对7MB)并包含你应该避免的所有东西,但实际上还是需要它。

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

另请参阅此文章,其中涵盖了您的要求的各个部分:Communication in JSF 2.0