我目前正在创建一个EJB3数据访问类来处理我的JavaEE6应用程序中的所有数据库操作。现在,由于JavaEE6提供了新的ApplicationScoped
注释,我想知道我的EJB应该具有什么状态,或者它是否应该是无状态的。
让DAO成为@Stateless
会话Bean还是@ApplicationScoped
Bean更好?那@Singleton
呢?与DAO相关的这些选项之间有什么区别?
编辑:我使用的是带有完整JavaEE6平台的Glassfish 3.0.1
发布于 2010-07-12 04:58:31
让DAO成为@无状态会话Bean或@ApplicationScoped Bean会更好些吗?@Singleton怎么样?与DAO相关的这些选项之间有什么区别?
我不会为DAOs使用无状态会话Beans:
EJB3.1中引入的@Singleton
可以让事情变得更好一些,但我仍然不会将DAOs实现为EJB。我更喜欢使用CDI (也可能是一个自定义的构造型,比如this article )。
否则我根本不会使用DAOs。JPA的实体管理器是Domain Store模式的实现,在DAO中包装对域存储的访问不会增加太多价值。
发布于 2010-07-14 22:29:54
经过重新思考,似乎DAO实际上不是我想要做的事情的正确名称。也许,正如帕斯卡所说,这真的只是一种假象。我刚刚找到了Netbeans Petstore示例-一个JavaEE6示例应用程序,请参见here -他们有一个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命名为PersonEJB,而只是例如PersonEJB(我认为"PersonFacade“可能会被误解),并将其设置为@Stateless,因为我认为Netbeans示例可以被认为是设计良好的。
发布于 2010-07-12 07:33:29
@Pascal:在我看来,我的DAO并不“负责”事务或安全性,因为容器管理这些服务。我只是在注释我的DAO中的方法(只是为了安全起见,因为事务是自动处理的)。注解已经是“责任”了吗?
好吧,你让我重新思考我的设计。希望这没问题,不要太离题,但这可能会有帮助--这就是我今天使用JEE6的方式:
这种方法有什么问题吗?
https://stackoverflow.com/questions/3223112
复制相似问题