当前位置: 首页 > 面试题库 >

用于简单CRUD的EJB 3会话Bean设计

宋昊然
2023-03-14
问题内容

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

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

我当时在考虑每个实体有一个会话bean,而CRUD定义了这些实体。然后,我想到了将所有这些会话bean合并到一个会话bean中的想法。然后我发现了这个有趣的博客条目,但是我必须承认我不了解所有内容(什么是ServiceFacade?)。

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

谢谢。

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


问题答案:

不知道您在谈论什么博客条目:)但是在您的特定情况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);
}

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

也可以看看

  • Java EE 5的通用CRUD组件
  • 不要重复DAO!-使用Hibernate和Spring DAO构建通用的类型安全DAO

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



 类似资料:
  • 如果使用EJB3单例会话Bean,那么让ConcurrentHashMap状态变量-correct没有意义?我可以只使用一个由容器并发管理器管理的常规HashMap?

  • > 在EJB3.0及其之前的版本中,该问题是如何处理的? 如果它保留了客户端特定的会话状态,那么单个实例将拥有所有客户端(试图并发访问)的特定数据?它会安全吗?? 如果我们可以在其他会话bean中使用静态最终变量和静态初始值设定项块或静态方法来初始化它们(因为静态变量也是每个类的数据,而不是每个实例的数据),以便跨bean共享公共数据,那么单例会话bean需要什么呢? 在singleton中使用业

  • 我对EJB有点陌生。我已经理解了HTTPSession是如何维护的(所有cookie funda)。互联网上所有的资源都写着“有状态会话Bean维护会话(记住客户机)”,但我找不到答案

  • 我有一个会话作用域bean,它使用代理注入到单例bean中。 从单例bean中,我需要调用会话作用域bean的某个初始化方法,它需要单例bean作为参数。此外,我不能改变会话范围bean的来源。 为了详细说明这个情况: 单例bean是一个服务,会话范围bean是一个Vaadin4Spring事件总线,为此我需要调用方法。 似乎没有办法检查,如果我已经订阅,并且我不能在某个实例上两次调用订阅。 有没

  • 我正在再次浏览Javaee7 oracle文档,下面是所述内容。 “单个会话bean在每个应用程序中实例化一次,并在应用程序的生命周期内存在。单个会话bean是为单个企业bean实例在客户端之间共享并由客户端并发访问的情况而设计的。” 我完全明白它在说什么。然而,仔细想想,session这个词在这里是非常误导人的。由于它存在于应用程序级别,“会话”一词在这里似乎不适用。 当我想到会话这个词时,我认

  • 问题内容: 我正在开发仅需要一些基本安全功能的仅Intranet的Web应用程序(J2EE)。该站点的授权用户将相对较少,但是我仍然需要实现某种安全的会话。 我正在查看的基本流程是访问站点=>登录=>使用站点=>完成后注销(或在关闭浏览器时自动注销)。一点也不花哨,登录时甚至没有“记住我”选项。身份验证的大部分工作已经完成- 该站点只能通过https访问,并且我有一个存储用户名和(加密)密码的数据