Escolar Documentos
Profissional Documentos
Cultura Documentos
Aqui, gostaria de propor uma boa prática em relação à implementação do GenericDao porque as operações básicas para persistência de dados são
todas idênticas independentemente do objeto a salvar, os métodos em questão são os de um CRUD: registro (Create), leitura (Read ), Atualização
(Update) e exclusão (Delete).
Portanto, não repita o DAO!!!! para aumentar a produtividade do nosso código devido a um GenericDao.
DAO genérico
A seguir, as etapas para implementar um DAO genérico no sistema ORM:
Em primeiro lugar, precisamos de uma interface DAO genérica que contenha os métodos CRUD comuns disponíveis, nossas outras interfaces
DAO específicas devem estendê-la:
PK create(T persistentObject);
T get(PK id);
List<T> getAll();
Então, a implementação da interface acima é simples, mas as outras implementações DAO também a estenderão:
@Transactional(propagation=Propagation.MANDATORY)
public class GenericDaoImpl<T, PK extends Serializable> extends HibernateDaoSupport implements GenericDao<T, PK> {
@SuppressWarnings("unchecked")
public PK create(T o) {
@SuppressWarnings("unchecked")
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
if (value == null) {
return null;
}
return value;
}
@SuppressWarnings("unchecked")
@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
if (o instanceof AbstractPersistentObject) {
if (((AbstractPersistentObject) o).isCreation()) {
getSession().saveOrUpdate(o);
} else {
getSession().merge(o);
}
} else {
DAO específico
Aqui, um exemplo usando a classe e interface abaixo em um DAO específico:
Exemplo de uma interface DAO específica que poderia chamar os métodos genéricos:
/**
*/
Em seguida, sua implementação que contém os métodos genéricos e o método específico ‘findByNumber’:
@Repository("chapterDao")
@Scope("singleton")
/**
* Find the chapter by number.
*/
@SuppressWarnings("unchecked")
@Override
@Transactional(propagation=Propagation.MANDATORY, readOnly=true)
public List<Chapter> findByNumber(String number) throws DataAccessException {
StringBuffer hql = new StringBuffer("select chapter from Chapter chapter ");
hql.append(" where chapter.number=:number ");
Query query = getSession().createQuery(hql.toString());
//
query.setString("number", number);
List<Chapter> chapters = query.list();
return chapters;
}
...
}
Essas classes e interfaces são construídas em torno das melhores práticas definidas na seção HashCode, métodos Equals e camada ORM do post
Java/Hibernate: HashCode, métodos Equals.
Assim, nosso POJO deve estender uma classe abstrata com os métodos HashCode, Equals substituídos para comparar corretamente dois objetos e
contendo também os atributos ‘id’ e ‘version’:
/**
* AbstractPersistentObject
* @author Huseyin OZVEREN
*/
return this.id;
}
return this.version;
}
return false;
// equivalência por id
return id.equals(other.getId());
}
if (id != null) {
return id.hashCode();
} else {
return super.hashCode();
}
}
}
public boolean isCreation() {
public AbstractPersistentObject() {
}
...
}
return book;
}
...
}
Este projeto precisa das seguintes bibliotecas: commons-beanutils-1.7.0.jar, commons-lang-2.4.jar, commons-logging-1.1.1.jar, hibernate-core-
3.3.1.GA.jar, junit-4.1.jar and spring-2.5.5.jar.
Conclusão:
Uma boa prática na programação de n camadas é agrupar as consultas na camada de serviço. O uso de um DAO genérico reduzirá o
número de linhas de código porque todos os métodos de acesso padrão estão disponíveis em uma classe. Assim, a camada de serviço
conterá apenas os métodos complexos. Além disso, todas as consultas com consultas HQL serão agrupadas em um único objeto de
serviço que corresponde a um objeto de domínio que representa um módulo.
Download: test_ORMTools.zip