简单CRUD的EJB 3会话Bean设计

sdo*_*oca 7 java ejb session-bean java-ee ejb-3.0

我正在编写一个应用程序,它的唯一目的是为了维护数据库中的记录而进行CRUD操作.某些表/实体之间存在关系.我已经看到了创建会话bean实例大多涉及与复杂的业务逻辑/操作,与我没有很多的实体交互.

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

我想每个实体有一个会话bean,它有CRUD定义的方法.然后我想到将所有会话bean组合到一个会话bean中.然后我发现这个博客条目很有趣,但我必须承认我并不了解所有这些(什么是ServiceFacade?).

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

谢谢.


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

Pas*_*ent 11

不确定你在谈论什么博客条目:)但在你的特殊情况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);
}
Run Code Online (Sandbox Code Playgroud)

豆子将如下:

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以看看

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