java - 用于简单 CRUD 的 EJB 3 session Bean 设计

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

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

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

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

我倾向于 session bean/实体类,但希望听到更多有经验的意见。

谢谢。


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

最佳答案

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

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);
}

bean 如下所示:

@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)的服务之后.

关于java - 用于简单 CRUD 的 EJB 3 session Bean 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946283/

相关文章:

java - java中可以有多个堆吗?

java - servlet 存在时浏览器找不到它

ajax - 没有收到从 jQuery ajax 到 JAVA RESTful web 服务的任何请求

java - 如何在 EJB jar 文件中包含 jar 依赖项?

java - Kettle 步骤中的 ClassCastException

java - 如何修复损坏的导入?

java - Apache Tomcat 7 - 请求的资源不可用

java - 禁用@Alternative 类

jakarta-ee - JSF 请求范围的 bean 不断在每个请求上重新创建新的有状态 session bean?

java - 如何将简单的 Java 项目部署到 EAR 中?