JavaEE6 DAO:它应该是@Stateless还是@ApplicationScoped?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (28)

我目前正在创建一个EJB3数据访问类来处理我的Java EE 6应用程序中的所有数据库操作。现在,由于Java EE 6提供了新的ApplicationScoped-Annotation,我不知道我的EJB应该具有什么状态,或者它应该是无状态的。

应该让DAO成为@Stateless Session Bean还是@ApplicationScoped Bean?那么@Singleton呢?与DAO相关的这些选项之间有什么区别?

我正在使用Glassfish 3.0.1和完整的Java EE 6平台

提问于
用户回答回答于

应该让DAO成为@Stateless Session Bean还是@ApplicationScoped Bean?那么@Singleton呢?与DAO相关的这些选项之间有什么区别?

我不会为DAO使用无状态会话Bean:

  1. 容器集合了EJB,因此如果每个池和数千个表有N个实例,那么您只会浪费资源(甚至没有提及部署时的成本)。
  2. 实现DAO作为SLSB将鼓励EJB链接,从可伸缩性的角度来看这不是一个好的做法。
  3. 我不会将DAO层绑定到EJB API。

@Singleton在EJB 3.1中引入可以让事情更好一点,但我仍然不会实现的DAO作为EJB的。

或者我根本不会使用DAO。JPA的实体管理器是域存储模式的实现,并且在DAO中封装对域存储的访问不会增加太多价值。

用户回答回答于

经过一番反思之后,似乎DAO实际上并不是我想要做的事情的正确名称。帕斯卡尔说,也许它确实是一个门面。我刚刚找到了Netbeans Petstore示例 - 一个JavaEE6示例应用程序,请参阅此处 - 它们有一个ItemFacade,负责从数据库中查找/创建/删除实体。这是一个无状态会话Bean。看起来像这样:

@Stateless
public class ItemFacade implements Serializable {
    @PersistenceContext(unitName = "catalogPU")
    private EntityManager em;

    public void create(Item item) { ... }
    public void edit(Item item) { ... }
    public void remove(Item item) { ... }
    public Item find(Object id) { ... }
    public List<Item> findAll() { ... }
    public List<Item> findRange(int maxResults, int firstResult) { ... }
    public int getItemCount() { ... }
}

因此,作为结论,我不再打电话给我的DAO DAO,而只是举个例子,PersonEJB(我认为“PersonFacade”可能会被误解),并且使得它也是@Stateless,因为我认为Netbeans例子可以被认为是精心设计的。

扫码关注云+社区