【问题标题】:About Enterprise Java Session Beans关于企业 Java 会话 Bean
【发布时间】:2012-07-14 03:48:50
【问题描述】:

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

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

 StudentList stud = businesslayer.businessMethod_GetStudentsFromDb(); 

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

现在我的问题如下:

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

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

【问题讨论】:

  • 您对 ejb 3.0 和 JEE5 有严格的限制吗?在 JEE6 中,您可以将 EJB 放在战争中(无需耳朵)。使用 ejb 3.1,您可能只需要将 @Stateless 注释添加到您的业务层对象,使其成为 EJB(您还需要更新您拥有的事务逻辑,大多数时候您只需将其删除)。

标签: java servlets netbeans ejb-3.0


【解决方案1】:

1

如果您正在构建单个应用程序,则无需复制任何内容。如果你想在业务代码和 web/view 代码之间有一个非常严格的分离,你可以创建一个ear,一个ejb module 和一个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,您将有一大块乏味的代码插入 @ 的各个字段将示例中所示的 987654328@ 实体转换为准备好的语句。

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

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

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

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

【讨论】:

  • 感谢您的精彩帖子,这绝对有帮助
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多