代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

javaee6dao:应该是@Stateless还是@ApplicationScoped?

  •  17
  • Wolkenarchitekt  · 技术社区  · 14 年前

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

    把刀当刀是不是更好 @Stateless 会话Bean或 @ApplicationScoped @Singleton ? 与DAO相关的这些选项之间有什么区别?

    编辑:

    3 回复  |  直到 5 年前
        1
  •  17
  •   Pascal Thivent    14 年前

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

    我不会对DAO使用无状态会话bean:

    1. 将DAOs实现为SLSB将鼓励EJB链接,从可伸缩性的角度来看,这不是一个好的实践。

    2. 我不会将DAO层绑定到ejbapi。

    这个 @Singleton EJB3.1中引入的DAOs可以使事情变得更好,但我仍然不会将DAOs实现为EJB。我更愿意使用CDI(也许还有一个定制的原型,请参见 this article 例如)。

    否则我就不用DAOs了。JPA的实体管理器是 Domain Store 对DAO中的域存储的模式和包装访问并没有增加多少价值。

        2
  •  2
  •   Wolkenarchitekt    14 年前

    经过一番反思,似乎道并不是我想做的事情的正确名称。也许它真的是一个门面,正如帕斯卡所说。 我刚刚找到了Netbeans Petstore示例—一个JavaEE6示例应用程序,请参阅 here 项目外观 它负责从数据库中查找/创建/删除实体。它是一个无状态会话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示例可以被认为是设计良好的。

        3
  •  0
  •   Wolkenarchitekt    14 年前

    @帕斯卡: 在我看来,我的DAO不“负责”事务或安全,因为容器管理这些服务。我只是在我的DAO中注释方法(只是为了安全,因为事务是自动处理的)。注释已经是“责任”了吗?

    好吧,你让我重新考虑我的设计。希望一切顺利,不要太离题,但也许会有帮助-这就是我今天使用JEE6的方式:

    • JSF访问cdibean,
    • cdibean访问DAO-EJB “业务逻辑”
    • 因此,目前我唯一的“业务逻辑”是执行CRUD,稍后我将为异步方法或计时器服务等关键任务添加一些其他ejb。
    • 我的DAO是泛型的,使用JPA2条件查询来执行类型安全查询(完全没有字符串)
    • 我知道对于persist/update/remove我不需要DAO(太简单了),但是对于我的查询我需要它;所以我把它们放在一起

    这种方法有问题吗?