Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 集成ice/ace:dataTable与JPA和请求范围bean_Jsf 2_Icefaces 2 - Fatal编程技术网

Jsf 2 集成ice/ace:dataTable与JPA和请求范围bean

Jsf 2 集成ice/ace:dataTable与JPA和请求范围bean,jsf-2,icefaces-2,Jsf 2,Icefaces 2,我想知道在Hibernate/JPA世界中,处理接收输入的数据表的正确方法是什么。据我所知,以下三种选择之一导致了整个纸牌屋的崩溃,但我不知道哪一种是错的 通过自定义JSF PhaseListener进行半自动事务和EntityManager处理,该JSF PhaseListener围绕每个请求开始并提交事务 将编辑组件放入数据表中 使用请求范围的托管bean,从请求范围的EntityManager获取数据(在PrettyFaces的帮助下,从URL设置请求范围bean的ID) 使用请求范围的

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

  • 通过自定义JSF PhaseListener进行半自动事务和EntityManager处理,该JSF PhaseListener围绕每个请求开始并提交事务
  • 将编辑组件放入数据表中
  • 使用请求范围的托管bean,从请求范围的EntityManager获取数据(在PrettyFaces的帮助下,从URL设置请求范围bean的ID)
  • 使用请求范围的bean而不是视图或会话范围的bean来支持数据表
我明白了,但它们都是手动管理事务,默认情况下不显示编辑组件。您单击导致对象被指定为可编辑的行,然后当您点击“保存”时,它会在手动触发保存之前手动将对象重新连接到新的EntityManager。我认为这里的点击编辑功能为我们提供了一种方法来确保正确的对象被重新连接到当前会话,我不知道如果没有类似的东西,人们会如何生活

我对新的ICEfaces 3.0 ace:dataTable(née PrimeFaces 2.0 dataTable)的印象是,它旨在用于视图或会话范围的bean中,但我看不出,如果有模型对象从请求A和EntityManager A中的DAO中出来,然后被请求B和EntityManager B修改或分页,那么如何才能绕过StaleObjectState和/或LazyInitializationException

我想它可能在JavaEE下通过某种深度fu工作,但我现在没有把我们从Tomcat6升级到任何更高级的东西的奢侈(尽管从长远来看这是我的意图)。我们也不会开始使用Spring或Seam或其他任何很酷的东西。冰面对我们来说已经够诡异了,老实说,可能太诡异了


总之,哪一个是错误的选择?请求范围的实体管理器、请求范围的数据表还是使用数据表中的编辑组件?还是真的有什么问题?

如果你问我的话,主要的问题似乎是当你的需求似乎在尖叫着要一个稍微花哨的东西时,一只几乎光秃秃的雄猫。通常的口头禅是,当你不需要“所有其他东西”的时候,你就使用Tomcat,所以当你确实需要它的时候,为什么还要继续使用一只光秃秃的Tomcat呢

也就是说,这种模式其实并不难

  • 拥有一个视图范围的支持bean
  • @PostConstruct
    -(当没有像id这样的参数时)或
    PreRenderViewEvent
    方法中结合视图参数获取初始数据
  • 使用单独的服务类,该服务类使用实体管理器来获取和保存数据
  • 将实体管理器设置为“事务范围”
    • 没有EJB/CDI/Spring:
      • 为每个操作从实体管理器工厂获取新的实体管理器
      • 启动(资源本地)事务,执行操作,提交事务,关闭实体管理器
  • 直接从支持bean返回实体列表,将表的编辑模式输入字段绑定到实体的相应属性
  • 更新单行时,将相应的实体传递给服务的更新方法。除了获取实体管理器、启动事务等的开销之外,这基本上只调用实体管理器上的
    merge()
要意识到,在服务之外,您一直在处理
分离的实体。因此,没有任何懒散初始化异常的风险。支持bean需要在视图范围内,以便JSF更新正确的(分离的!)实体,然后您自己的代码将其传递给服务,服务将其合并到持久性上下文中

因此,持久化的流程是:

View state View scope Transaction scoped PC Facelet/components Backing Bean Service Strings ------> Detached entities --> Attached entities 查看状态查看范围事务范围PC Facelet/components支持Bean服务 字符串------->分离的实体-->附着的实体 (获取数据的流程正好相反)

然而,以这种方式创建服务有点乏味,是一种受虐狂行为。对于一个示例应用程序和上面讨论的两种方法(get和update),这不会太糟糕,但对于任何规模较大的应用程序,这将很快失控

如果您已经在向Tomcat添加JSF和JPA,只需帮自己一个忙,并使用类似的方法。这只比Tomcat(25MB对7MB)大不了多少,并且包含了所有你应该尽量避免但实际上无论如何都需要的东西

如果您绝对无法升级Tomcat安装(例如,产品所有者或经理认为他拥有服务器而不是开发人员),您可能需要投资学习CDI。这可以很容易地添加到您的war中(只需一个额外的jar),让您抽象出大量繁琐的代码。您还可以真正使用JTA提供者。这也可以单独添加到您的war中,但添加的内容越多,使用TOME(或GlassFish、Resin、JBoss等替代品)效果越好


另请参阅本文,它涵盖了您需求的各个部分:

谢谢您的详细回答。如果我有我的德鲁瑟斯,我们将升级到玻璃鱼;我已经让我们的一些应用程序在它下成功加载,但还没有得到任何东西在TomEE下实际运行。我完全同意你对形势的分析,我只是不想在这个时候强迫公司做我想做的事情。不过,我想我还是能够运用你的建议,找到前进的道路。再次感谢@DanielLyons为了我们的利益(我为TomE工作