I am writing an application that\'s sole purpose in life is to do CRUD operations for maintaining records in database. There are relationships between some of the tables/en
Not sure what blog entry you're talking about :) But in your particular situation1, I'd probably use a single session bean implementing an interface similar to:
public interface GenericCrudService {
public T create(T t);
public T find(Class type, Object id);
public void delete(T t);
public T update(T t);
public List findWithNamedQuery(String queryName);
public List findWithNamedQuery(String queryName, int resultLimit);
public List findWithNamedQuery(String namedQueryName,
Map parameters);
public List findWithNamedQuery(String namedQueryName,
Map parameters,
int resultLimit);
public List findWithNativeQuery(String sql, Class type);
}
And the bean would be as follow:
@Stateless
@Remote(GenericCrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class GenericCrudServiceBean implements GenericCrudService {
@PersistenceContext
private EntityManager em;
@Override
public T create(T t) {
em.persist(t);
return t;
}
@Override
public T find(Class type, Object id) {
return em.find(type, id);
}
@Override
public void delete(T t) {
t = em.merge(t);
em.remove(t);
}
@Override
public 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 parameters) {
return findWithNamedQuery(namedQueryName, parameters, 0);
}
@Override
public List findWithNamedQuery(String namedQueryName,
Map parameters,
int resultLimit) {
Query query = this.em.createNamedQuery(namedQueryName);
if(resultLimit > 0) {
query.setMaxResults(resultLimit);
}
for (Map.Entry entry : parameters.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
return query.getResultList();
}
@Override
@SuppressWarnings("unchecked")
public List findWithNativeQuery(String sql, Class type) {
return em.createNativeQuery(sql, type).getResultList();
}
}
1 Most application shouldn't expose raw CRUD directly to clients but shield CRUD behind services implementing business rules and encapsulating access to Domain Stores (the EntityManager
).