EJB 3 Session Bean Design для простого CRUD
Я пишу приложение, единственной целью которого является выполнение CRUD-операций для ведения записей в базе данных. Есть связи между некоторыми из таблиц / сущностей. Большинство примеров, которые я видел для создания сессионных компонентов, имеют дело со сложной бизнес-логикой / операциями, которые взаимодействуют со многими объектами, которых у меня нет.
Так как мое приложение очень простое, что будет лучшим дизайном для сессионного компонента?
Я думал о том, чтобы иметь по одному сессионному компоненту на сущность, для которой были определены методы CRUD. Затем я подумал объединить все эти сессионные компоненты в один сессионный компонент. А потом я нашел эту запись в блоге, которая заинтриговала, но я должен признать, что я не все понимаю (что такое ServiceFacade?).
Я склоняюсь к сессионному классу bean/entity, но хотел бы услышать более опытные мнения.
Благодарю.
Ой, вот ссылка на блог: http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao
1 ответ
Не уверен, о какой записи блога вы говорите:) Но в вашей конкретной ситуации 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();
}
}
Смотрите также
- Общие компоненты CRUD с Java EE 5
- Не повторяйте DAO! - Создайте универсальный тип безопасности DAO с помощью Hibernate и Spring DAO.
1 Большинство приложений не должны предоставлять сырые CRUD напрямую клиентам, а защищать CRUD от сервисов, реализующих бизнес-правила и инкапсулирующих доступ к хранилищам доменов ( EntityManager
).