2010-07-26 64 views

回答

1

EJB规范支持瞬态和持久对象。瞬态对象被称为会话bean,而持久对象被称为实体bean。

A Session Bean 

会话bean是由客户端创建的EJB,通常只存在于单个客户端 - 服务器会话期间。会话bean通常代表客户端执行诸如计算或数据库访问等操作。虽然会话bean可能是事务性的,但如果发生系统崩溃则无法恢复。会话bean对象可以是无状态的,也可以在方法和事务之间保持会话状态。如果会话bean维护一个状态,那么如果必须从内存中删除该对象,则EJB容器将管理此状态。但是,持久数据必须由会话bean对象本身来管理。

容器工具在部署时为会话bean生成附加类。这些工具通过检查其类和接口从EJB体系结构中获取信息。这些信息被用来动态生成两个实现bean的home和remote接口的类。这些类使容器能够调用会话bean上的所有客户端调用。容器也生成一个可序列化的Handle类,它提供了一种在特定生命周期内识别会话bean实例的方法。可以实现这些类,以便在与容器特定的代码混合时执行自定义的操作和功能。

除了这些自定义类以外,每个容器还提供了一个为客户端提供元数据并实现SessionContext接口的类。这可以访问有关调用bean的环境的信息。

An Entity Bean 

实体bean是永久数据存储库(如数据库)中维护的持久性数据的对象表示形式。主键标识实体bean的每个实例。实体bean是事务性的,在发生系统崩溃时可以恢复。

实体bean是显式数据或数据集合的表示,例如关系数据库中的行。实体bean方法提供了对bean的数据表示进行操作的过程。一个实体bean是持久的,只要它的数据保留在数据库中就可以存活。

可以通过两种方式创建实体bean:通过在bean的home接口上调用create()方法的客户机的直接操作,或者通过向数据库添加数据的其他操作(bean类型代表。事实上,在包含遗留数据的环境中,甚至可以在部署EJB之前存在实体对象。

实体bean可以实现bean管理的或容器管理的持久性。对于bean管理的持久性,实体bean的实现者通过直接的数据库调用来存储和检索bean管理的信息。该bean可以为这种方法使用Java数据库连接(JDBC)或SQL-Java(SQLJ)。 (会话bean也可以访问他们使用JDBC或SQLJ管理的数据。)这种方法的一个缺点是它使得更容易将bean管理的持久性调整为替代数据源。

对于容器管理的持久性,容器提供者可以使用标准API实现对数据库的访问。容器提供者可以提供工具来映射实体bean的实例变量以调用底层数据库。这种方法使得使用具有不同数据库的实体bean更容易。

+1

这些天来,我们使用JPA,而不是Entity Beans – djna 2010-07-26 06:27:16

+1

当然,用于对象关系映射的POJO持久化模型是非常好的。我只是试图清除会话bean和实体bean之间的区别。 – Rupeshit 2010-07-26 06:55:06

2

两者都允许您编写从数据库中获取数据的Java数据库,但实际编码是非常不同的。

JDBC允许您编写SQL代码

INSERT INTO ... 

SELECT ... WHERE 

然后,您必须编写自己的代码到你的Java对象和JDBC代码之间传输数据。最终会出现很多反复的“将该字段放在该列中”类型的代码。

看看例如link text的例子来得到一种风味。

在JPA/Hibernate中,您只需使用关于哪些表和列与字段对应的说明来注释Java类。大大减少了你需要编写的代码量。

这是因为这个例子中(从this JPA example视为简单:

@Entity 
public class Inventory { 
    @Id 
    protected long id; 
    ... 
    public void setItem(Item item) { 
     this.item = item; 
     this.id = item.getSKU(); 
    } 
    ... 
} 

我要说的是会话Bean + JPA比会话Bean + JDBC的努力相当少