简单但好的 EJB 设计模式

4
您建议作为一个既好用实用又简单的解决方案模式,其中包括以下内容:
  • HTML + JSP(作为视图/演示)
  • Servlets(控制器、请求、会话处理)
  • EJB(持久性、业务逻辑)
  • MySQL数据库
是否需要使用自己的DAO层来进行持久化?我使用JPA将对象持久化到我的数据库中。
应该将业务逻辑从我的EJB中撤回吗?所有在线信息都告诉我不同的事情,这让我很困惑...
3个回答

5
我一定会将业务逻辑放在无状态会话Bean中。无状态会话Bean很好地捕捉了事务边界,并将View层与持久性层分离。
确保SSB的方法对应于用户想要达到的小型业务目标。
另一个要点是,您必须确保返回的数据具有对象树中的所有数据,并且不依赖懒加载获取其余数据,因为这会引起各种问题。
尽可能远离有状态会话Bean:它们是坏消息,在Web应用程序的上下文中是一种失效的概念。
对于长时间运行的事情,请考虑使用消息驱动的Bean,通过发送JMS消息来触发。这是一种很好的方式来进行后台处理,可以更快地释放业务逻辑,使事务更短,并更快地将控制权返回给最终用户。

1
你对SFSBs的说法过于极端了。初学者应该谨慎使用它们,而高级用户可能应该适度使用它们,但在我看来,它们并不是一定要避免的东西。如果你使用它们,你可能需要给它们一个CDI范围。 - Mike Braun

5
我建议使用您选择的MVC框架,无状态会话Bean处理业务逻辑和事务管理(如果不需要远程访问,则优先使用本地接口),实体进行持久化。尽可能地注入您的EJB(如果您使用Java EE 6,则可以在任何地方注入,并且还可以跳过接口)。
有必要使用自己的DAO层进行持久化吗?我使用JPA将对象持久化到我的数据库中。某些人可能会说是,但在大多数情况下我认为不需要。EntityManager已经实现了Domain Store模式,因此对于简单需求,没有必要在DAO后面保护它。
您可能需要阅读以下资源以获取更多意见:

我应该从我的EJB中撤回业务逻辑吗?

我不会这样做。把你的业务逻辑放在(Stateless) Session Beans中。EJB3是POJOs,易于测试,没有必要将业务逻辑委托给另一层。


1

现在是2012年,我不建议使用Servlets和JSP作为表现层。这在2002年很流行,但那已经过去十年了。

今天Java EE有一个内置的优秀MVC框架叫做JSF。您最好使用它。您可能希望从组件库PrimeFaces中获取一些小部件,因为所有标准小部件都有点基础。像OmniFaces这样的实用程序库也是一个很好的补充。

关于DAO,不要直接在(JSF)后备bean中使用实体管理器,但如果您已经为业务逻辑使用Service类(事务边界),则使用DAO可能过度。

DAO仍然有一些小优点,例如dao.findByName(...)比加载命名查询、设置参数并获取(单个)结果看起来更清晰,但代价是您必须维护每个实体的单独DAO,可能还需要一些服务。


不确定在2012年时的情况,但JSF在我们大多数应用程序中都是一个庞大的臃肿软件。我们大部分工作都是数据报告,所以使用ajax和大量的javascript似乎更快。 - Johnny Bigoode
2012年,JSF还算不错。而到了2016年,随着2.3版本的推出和OmniFaces的加入,它变得更好了。 - Mike Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接