EJB 3 Session Bean Design для простого CRUD - PullRequest
7 голосов
/ 01 июня 2010

Я пишу приложение, единственной целью которого является выполнение CRUD-операций для ведения записей в базе данных. Есть связи между некоторыми из таблиц / сущностей. Большинство примеров, которые я видел для создания сессионных компонентов, имеют дело со сложной бизнес-логикой / операциями, которые взаимодействуют со многими объектами, которых у меня нет.

Поскольку мое приложение очень простое, каков будет лучший дизайн для сессионного компонента (ей)?

Я думал о том, чтобы иметь по одному сессионному компоненту на сущность, для которой были определены методы CRUD. Затем я подумал объединить все эти сессионные компоненты в один сессионный компонент. А потом я нашел эту запись в блоге, которая заинтриговала, но я должен признать, что не все понимаю (что такое ServiceFacade?).

Я склоняюсь к классу сессионного компонента / сущности, но хотел бы услышать более опытные мнения.

Спасибо.


Упс, вот ссылка на блог: http://www.adam -bien.com / roller / abien / entry / generic_crud_service_aka_dao

1 Ответ

11 голосов
/ 01 июня 2010

Не уверен, о какой записи блога вы говорите :) Но в вашей конкретной ситуации 1 , я бы, вероятно, использовал один сессионный компонент, реализующий интерфейс, подобный:

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).

...