Jsf 2 集成ice/ace:dataTable与JPA和请求范围bean
我想知道在Hibernate/JPA世界中,处理接收输入的数据表的正确方法是什么。据我所知,以下三种选择之一导致了整个纸牌屋的崩溃,但我不知道哪一种是错的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) 使用请求范围的
- 通过自定义JSF PhaseListener进行半自动事务和EntityManager处理,该JSF PhaseListener围绕每个请求开始并提交事务
- 将编辑组件放入数据表中
- 使用请求范围的托管bean,从请求范围的EntityManager获取数据(在PrettyFaces的帮助下,从URL设置请求范围bean的ID)
- 使用请求范围的bean而不是视图或会话范围的bean来支持数据表
总之,哪一个是错误的选择?请求范围的实体管理器、请求范围的数据表还是使用数据表中的编辑组件?还是真的有什么问题?如果你问我的话,主要的问题似乎是当你的需求似乎在尖叫着要一个稍微花哨的东西时,一只几乎光秃秃的雄猫。通常的口头禅是,当你不需要“所有其他东西”的时候,你就使用Tomcat,所以当你确实需要它的时候,为什么还要继续使用一只光秃秃的Tomcat呢 也就是说,这种模式其实并不难
- 拥有一个视图范围的支持bean
- 在
-(当没有像id这样的参数时)或@PostConstruct
方法中结合视图参数获取初始数据PreRenderViewEvent
- 使用单独的服务类,该服务类使用实体管理器来获取和保存数据
- 将实体管理器设置为“事务范围”
- 没有EJB/CDI/Spring:
- 为每个操作从实体管理器工厂获取新的实体管理器
- 启动(资源本地)事务,执行操作,提交事务,关闭实体管理器
- 没有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工作