java - 关于企业 Java session Bean

标签 java servlets netbeans ejb-3.0

对于 Enterprise Java 开发完全陌生,在阅读 following 后教程。我成功开发了我的第一个 session bean。在阅读了一些有关 session bean 的内容后,我确实对它( session bean)有一些疑问,我希望这里的专家可以帮助我。

通常在不使用 EJB 的 servlet 场景中,我们会执行如下操作来完成特定任务

 StudentList stud = businesslayer.businessMethod_GetStudentsFromDb(); 

现在业务层将调用服务层,服务层将从数据库获取详细信息并将其返回。

现在我的问题如下:

1-如果我要使用无状态 EJB 来实现此机制,我必须将包含域对象 StudentList 的域包复制到我的企业项目的“-ejb”文件夹(我正在使用 netbeans)。类似地,我必须将其他业务方法从“-war”文件夹的源文件夹复制到 ejb 文件夹,以便“-ejb”文件夹中的无状态 bean 可以使用这些方法。 “-ejb”文件夹内的类不能使用“-war”文件夹的源文件夹内的类。

2-这是迄今为止我无法理解的问题。如果我使用 EJB 而不是当前的机制,我会获得什么优势?

最佳答案

1

如果您正在构建单个应用程序,则无需复制任何内容。如果您想在业务代码和 Web/ View 代码之间进行非常严格的分离,您可以创建一个 ear ,以及一个 ejb module 和一个 web module 。 web模块中的所有类都可以访问ejb模块中的所有类,但反之则不然。这有效地在您的应用程序中强加了分层。

但你不必必须进行这种分离。您还可以将您的 EJB bean 与您的 Servlet 等一起投入一场 war 中。对于放置 bean 的位置没有限制。它可以位于单独的包中,也可以与 Servlet 位于同一包中。

你可能想看看我制作的这个例子:http://arjan-tijms.omnifaces.org/2011/08/minimal-3-tier-java-ee-app-without-any.html。其中,BusinessBean 是一个 EJB,它与单个 war 中的 JSF 支持 bean 驻留在同一(默认)包中。

在单一 war 设置中,一切都可以访问一切。请注意,即使在这种情况下,您可能也希望保持业务代码“干净”,并保留诸如 HttpRequest 之类的内容。

2

EJB bean,尤其是轻量级 EJB,提供了大多数 Web 应用程序所需的功能:事务、池化、线程安全性、安全性和注入(inject)。与 JPA 结合使用时,您将充分利用 EJB bean。优点是您的代码将更加简洁,同时可以避免使用普通 JDBC 时遇到的竞争条件和不一致问题。

例如

@Stateless 
public class CustomerService { 

  @PersistenceContext 
  private EntityManager entityManager; 

  public void addCustomer(Customer customer) { 
    entityManager.persist(customer); 
  } 
}

如果没有 EJB,您将需要一堆 try/finally block 来打开和关闭连接、启动和提交事务等。如果没有 JPA,您将有一大堆乏味的代码,用于插入 Customer 的各个字段将示例中显示的实体转换为准备好的语句。

如果您(稍后)拥有调用一个或多个其他服务的服务,并且要么需要将所有内容保存到数据库中,要么什么都不保存(而不是中间未定义的内容),那么用普通 JDBC 来完成这将是一个相当大的挑战。除了可以在中间阶段使用的方法之外,您还必须传递打开的连接,并且需要打开/关闭连接和启动/提交事务的每个服务方法的特殊变体。不久之后,这将变得高度复杂,变成一个大泥球。

使用 EJB,您从另一个 EJB bean 中调用的 EJB bean 中的每个方法都会自动加入正在进行的事务,或者在没有事务正在进行时启动自己的方法。仅此一项就大大简化了典型 Web 应用程序执行的许多常见业务任务。

不要让任何人告诉你只有“企业应用程序”需要事务,而 Web 应用程序不需要这个。这是不正确的。事务是进行数据库操作时非常基本的东西,与主键或外键具有相同的基本要求。当执行订单(在网上商店)的业务逻辑时,您绝对不希望您的库存减少,但没有发送实际订单,或者发送订单但没有从客户帐户中扣除资金,等等。最简单的业务逻辑通常涉及写入至少两个表,每次发生这种情况时,您最好使用事务。

但请确保您使用的是 EJB 3。远离与 EJB 2 有关的一切。甚至不要碰像 home 接口(interface)或 Entity Beans 这样的东西,它们已经被弃用了大约 6 年。 (不过,不要将 EJB 实体 Bean 与 JPA 实体混淆,尽管不幸的是名称相似,但它们完全不同。JPA 实体非常理智且有用)

关于java - 关于企业 Java session Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11480863/

相关文章:

java - 如何在 JFrame 颜色选择器中仅启用 RGB 选项卡

java - 保留日志文件的 2 个先前版本

Java -JsonArray.contains(string) 没有这个函数?

java - 订购另一个人的 Collection

servlets - 以编程方式将 servlet 添加到嵌入式灰熊

java - GWT - 如何确定要设置和/或获取客户国家/位置的语言?

java - Netbeans 中用于 SQLite 的 JDBC : No suitable driver found

php - PHP 中无法访问的语句

java - 如何将 NetBeans 项目导入 Eclipse,反之亦然?

eclipse 停止意外调试