我正在编写一个应用程序,其唯一目的是为了维护数据库中的记录而进行CRUD操作。某些表/实体之间存在关系。我见过的用于创建会话bean的大多数示例都涉及复杂的业务逻辑/操作,这些逻辑/操作与我没有的许多实体进行交互。
由于我的应用程序非常基础,会话bean的最佳设计是什么?
我在想每个实体有一个会话bean,它有CRUD定义的方法。然后我想到将所有会话bean组合到一个会话bean中。然后我发现这个博客条目很有趣,但我必须承认我不了解所有这些(什么是ServiceFacade?)。
我倾向于会话bean /实体课,但希望听到更多有经验的意见。
感谢。
哎呀,这是博客链接:http://www.adam-bien.com/roller/abien/entry/generic_crud_service_aka_dao
答案 0 :(得分: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);
}
豆子将如下:
@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
)的服务之后。子>