2

作为企业 Java 开发的新手,在阅读了以下教程之后。我设法开发了我的第一个会话 bean。在阅读了一些关于会话 bean 的内容后,我确实有一些关于它(会话 bean)的问题,我希望这里的专家可以帮助我。

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

 StudentList stud = businesslayer.businessMethod_GetStudentsFromDb(); 

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

现在我的问题如下:

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

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

4

1 回答 1

4

1

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

但你不必为了这种分离而去。您也可以将您的 EJB bean 与您的 Servlet 以及您拥有的东西放在一起。你把豆子放在哪里没有限制。它可以位于单独的包中,也可以与 Servlet 位于同一包中。

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

在单一战争设置中,一切都可以访问一切。请注意,即使在这种情况下,您也可能希望保持您的业务代码“干净”,并将诸如此类HttpRequest的事情排除在外。

2

EJB bean,尤其是 EJB light,提供了大多数 Web 应用程序需要的东西:事务、池、线程安全、安全性和注入。与 JPA 结合使用时,您将充分利用 EJB bean。优点是您的代码将不那么冗长,同时避免使用纯 JDBC 时遇到的竞争条件和不一致。

例如

@Stateless 
public class CustomerService { 

  @PersistenceContext 
  private EntityManager entityManager; 

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

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

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

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

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

请确保您使用的是 EJB 3。远离所有与 EJB 2 相关的事物。甚至不要触摸 Home 接口或实体 Bean 之类的东西,它们已经被弃用了大约 6 年。(不要将 EJB 实体 Bean 与 JPA 实体混淆,尽管不幸的名称相似,但它们完全不同。JPA 实体非常理智和有用)

于 2012-07-14T16:03:28.010 回答