Estou estudando o hibernate, mas estou vendo muitas formas de implementar buscas, saves, delete e etc.
Vi alguns exemplos de genericDao e cada um tinha uma coisa diferente.
Poderiam me sugerir uma melhor forma pra fazer meus metodos de acesso a banco ?
Gostaria que fosse utilizando apenas o hibernate com Session e não JPA, pq com esse eu já vi um exemplo bom.
Se possível com controle de transação na mão para entender melhor.
Tem exemplos que vi q usam metodos que abrem e fecham transação até em buscas. Precisa disso ?
Tem alguns q utilizam flush() e outros não. To estudando, mas se puderem me adiantar esses detalhes !!
Então você pode criar diversas maneiras de fazer um DAO genérico para implementar o seu hibernate, eu tenho uma classe só com métodos genéricos que criei, vou postar um exemplo comum para ver se é o que vc precisa
/**
* Método criado para salvar se o registro não existir no banco ou alterar se a primary key for identificada e já existir
* @param object - Objeto populado com os registros.
* @throws Exception
*/
public void saveOrUpdate(Object object) throws Exception{
try{
session.saveOrUpdate(object);
session.flush();
transaction.commit();
}catch(Exception e){
transaction.rollback();
throw new Exception(e.getMessage());
}finally{
session.close();
}
}
Eu queria compartilhar oq tenho hoje e gostaria da opinião de vcs !
abstract class GenericDAO<T> implements Serializable {
private static final long serialVersionUID = -4267978367898190996L;
private static SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
public Session getSession() {
Session session = threadLocal.get();
if (session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public void beginTransaction() {
getSession().beginTransaction();
}
public void commit() {
getSession().getTransaction().commit();
}
public void rollBack() {
getSession().getTransaction().rollback();
}
public void closeSession() {
getSession().close();
}
public void save(T entity) {
getSession().saveOrUpdate(entity);
}
public void delete(T entity) {
getSession().delete(entity);
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
Criteria criteria = getSession().createCriteria(entityClass);
criteria.setMaxResults(500);
return criteria.list();
}
@SuppressWarnings("unchecked")
public T findById(int entityID) {
return (T) getSession().get(entityClass, entityID);
}
@SuppressWarnings("unchecked")
public List<T> findByExample(T filtro, MatchMode matchMode, boolean ignoreCase){
Example example = Example.create(filtro);
if(matchMode != null){
example = example.enableLike(matchMode);
}
if(ignoreCase){
example = example.ignoreCase();
}
return getSession().createCriteria(entityClass).add(example).list();
}
}
Dessa forma eu preciso fazer chamadas como essa né ?
beginTransaction();
save(pessoa);
commit();
O commit() já fecha a transação ?
Preciso fechar a Session ?
Vi exemplos em jpa q tem q fechar diretamente por uma chamada a um metodo.
Alguns exemplos usam load() no findById();
Poderiam dizer a melhor forma de implementar esses métodos acima ?
Se quiserem compartilhar seus DAO´s agradeço imensamente
Quanto a colocar o begin no seu código e chamar o save e depois dar commit eu não aconselho pois vc deve deixar sua regra de negócio na Implementação, então crie um DAO genérico e faça sua regra na Implementação e só use na sua classe controller, essa é a minha dica, pode haver uma galera ai que faça diferente mais esse seria meu ponto de vista.