【问题标题】:EJB 3 Session Bean Design for Simple CRUD用于简单 CRUD 的 EJB 3 会话 Bean 设计
【发布时间】:2010-05-31 22:35:00
【问题描述】:

我正在编写一个应用程序,它的唯一目的是执行 CRUD 操作以维护数据库中的记录。一些表/实体之间存在关系。我见过的大多数创建会话 bean 的示例都涉及与许多我没有的实体交互的复杂业务逻辑/操作。

由于我的应用程序非常基础,会话 bean 的最佳设计是什么?

我正在考虑每个实体有一个会话 bean,其中定义了 CRUD 方法。然后我想到将所有这些会话 bean 组合成一个会话 bean。然后我发现这篇博文很有趣,但我必须承认我并不完全了解它(什么是 ServiceFacade?)。

我倾向于会话 bean/实体类,但想听听更有经验的意见。

谢谢。


糟糕,这是博客链接:http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao

【问题讨论】:

    标签: java jakarta-ee ejb-3.0 ejb session-bean


    【解决方案1】:

    不确定您在说什么博客条目:) 但是在您的特定情况下1,我可能会使用单个会话 bean 来实现类似于以下的接口:

    public interface GenericCrudService {
        public <T> T create(T t);
        public <T> T find(Class<T> type, Object id);
        public <T> void delete(T t);
        public <T> T update(T t);
        public List findWithNamedQuery(String queryName);
        public List findWithNamedQuery(String queryName, int resultLimit);
        public List findWithNamedQuery(String namedQueryName, 
                                       Map<String, Object> parameters);
        public List findWithNamedQuery(String namedQueryName, 
                                       Map<String, Object> parameters,
                                       int resultLimit);
        public <T> List<T> findWithNativeQuery(String sql, Class<T> type);
    }
    

    豆子如下:

    @Stateless
    @Remote(GenericCrudService.class)
    @TransactionAttribute(TransactionAttributeType.MANDATORY)
    public class GenericCrudServiceBean implements GenericCrudService {
        @PersistenceContext
        private EntityManager em;
    
        @Override
        public <T> T create(T t) {
            em.persist(t);
            return t;
        }
    
        @Override
        public <T> T find(Class<T> type, Object id) {
            return em.find(type, id);
        }
    
        @Override
        public <T> void delete(T t) {
            t = em.merge(t);
            em.remove(t);
        }
    
        @Override
        public <T> T update(T t) {
            return em.merge(t);
        }
    
        @Override
        public List findWithNamedQuery(String queryName) {
            return em.createNamedQuery(queryName).getResultList();
        }
    
        @Override
        public List findWithNamedQuery(String queryName, int resultLimit) {
            return em.createNamedQuery(queryName).setMaxResults(resultLimit)
                    .getResultList();
        }
    
        @Override
        public List findWithNamedQuery(String namedQueryName,
                                       Map<String, Object> parameters) {
            return findWithNamedQuery(namedQueryName, parameters, 0);          
        }
    
        @Override
        public List findWithNamedQuery(String namedQueryName,
                                       Map<String, Object> parameters,
                                       int resultLimit) {
            Query query = this.em.createNamedQuery(namedQueryName);
            if(resultLimit > 0) {
                query.setMaxResults(resultLimit);            
            }
            for (Map.Entry<String, Object> entry : parameters.entrySet()) {
                query.setParameter(entry.getKey(), entry.getValue());
            }
            return query.getResultList();
        }
    
        @Override
        @SuppressWarnings("unchecked")
        public <T>  List<T> findWithNativeQuery(String sql, Class<T> type) {
            return em.createNativeQuery(sql, type).getResultList();
        }
    }
    

    另见

    1 大多数应用程序不应将原始 CRUD 直接暴露给客户端,而是将 CRUD 隐藏在实现业务规则的服务和封装对域存储的访问(EntityManager)之后。

    【讨论】:

    • 抱歉忘记发布博客链接,我已经编辑/添加了它。它与您的解决方案非常相似,但指出“接口实现实际上是一个服务,它总是必须在 ServiceFacade 后面执行”,我还没有弄清楚。
    • 我花了一些时间来理解泛型类(仍然掌握泛型)。但是,我弄清楚了他们的意思/做什么。谢谢!
    • 你上面的实现是否如你所说,shield CRUD behinds services implementing business rules and encapsulate access to EntityManager。看来您没有封装对EntityManager 的访问。你应该如何修复上面的代码来封装EntityManager。还有一个问题,当我尝试从Managed Bean 访问EJB 时,我必须使用@EJB private GenericCrudService myEJB,而不是@EJB private GenericCrudServiceBean myEJB。我认为后者会更有意义,因为GenericCrudService 只是和接口,GenericCrudServiceBean 是无状态 bean
    • 我有几个关于我的解决方案的问题,我在这里发布一个新问题,请帮助:stackoverflow.com/questions/5641310/…
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多