Então, vamos mexer em algumas coisinhas.
O VRaptor é poderosíssimo e tem alguns recursos que você pode utilizar, tais como a injeção de dependências.
Por exemplo: Criar um DAO genérico e não se preocupar mais com código repetido, mas sim com código específico:
public class GenericDAO<T> {
private final Class<T> classe;
private final Session session;
public GenericDAO(Session session, Class<T> classe) {
this.session = session;
this.classe = classe;
}
public void saveOrUpdate(T obj) throws HibernateException {
try {
this.session.getTransaction().begin();
this.session.saveOrUpdate(obj);
this.session.getTransaction().commit();
} catch (HibernateException e) {
this.session.getTransaction().rollback();
throw e;
}
}
public void delete(T obj) throws HibernateException {
try {
this.session.getTransaction().begin();
this.session.delete(obj);
this.session.getTransaction().commit();
} catch (HibernateException e) {
this.session.getTransaction().rollback();
throw e;
}
}
public void delete(Long id) throws HibernateException {
this.delete(this.get(id));
}
public T get(Long id) throws HibernateException {
T obj = classe.cast(this.session.createCriteria(classe)
.add(Restrictions.idEq(id)).uniqueResult());
Hibernate.initialize(obj);
return obj;
}
@SuppressWarnings("unchecked")
public List<T> list() throws HibernateException {
return this.session.createCriteria(classe).list();
}
}
Dessa forma, seu GrupoDAO fica um pouco melhor:
@Component
public class GrupoDAO {
private final Session session;
private GenericDAO<Grupo> genericDAO;
public GrupoDAO(Session session) {
this.session = session;
genericDAO = new GenericDAO<Grupo>(session, Grupo.class);
}
public void saveOrUpdate(Grupo obj) throws HibernateException {
genericDAO.saveOrUpdate(obj);
}
public void delete(Grupo obj) throws HibernateException {
genericDAO.delete(obj);
}
public void delete(Long id) throws HibernateException {
genericDAO.delete(id);
}
public Grupo get(Long id) throws HibernateException {
return genericDAO.get(id);
}
public List<Grupo> list() throws HibernateException {
return genericDAO.list();
}
// Por ser mais específico, pode ficar dessa forma. Embora exista um jeito
// melhor.
// Buscar Dispositivos
@SuppressWarnings("unchecked")
public List<Grupo> busca(String nomeGrupo) {
return session
.createCriteria(Grupo.class)
.add(Restrictions.ilike("nomeGrupo", nomeGrupo,
MatchMode.ANYWHERE)).list();
}
}
Mas para isso, você vai precisar fazer um ComponentFactory de Session e de SessionFactory:
@Component
public class SessionProvider implements ComponentFactory<Session> {
private Session session;
public SessionProvider(SessionFactory sessionFactory) {
session = sessionFactory.openSession();
}
@Override
public Session getInstance() {
return session;
}
@PreDestroy
public void destroy() {
this.session.close();
}
}
@Component
@ApplicationScoped
public class SessionFactoryProvider implements ComponentFactory<SessionFactory> {
private SessionFactory sessionFactory;
public SessionFactoryProvider() {
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.setProperty("hibernate.connection.username", "root");
configuration.setProperty("hibernate.connection.password", "");
configuration.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/banco");
configuration.setProperty("hibernate.connection.driver_class",
"com.mysql.jdbc.Driver");
configuration.setProperty("hibernate.dialect",
"org.hibernate.dialect.MySQL5InnoDBDialect");
configuration.setProperty("hibernate.hbm2ddl.auto", "update");
configuration.setProperty("show_sql", "false");
configuration.setProperty("format_sql", "false");
configuration.setProperty("hibernate.connection.provider_class",
"org.hibernate.connection.C3P0ConnectionProvider");
configuration.setProperty("hibernate.c3p0.acquire_increment", "2");
configuration.setProperty("hibernate.c3p0.timeout", "25200");
configuration.setProperty("hibernate.c3p0.min_size", "2");
configuration.setProperty("hibernate.c3p0.max_size", "10");
configuration.setProperty("hibernate.c3p0.max_statements", "0");
configuration.setProperty("hibernate.generate_statistics", "false");
configuration.addAnnotatedClass(Grupo.class);
configuration.addAnnotatedClass(Usuario.class);
this.sessionFactory = configuration.buildSessionFactory();
}
@Override
public SessionFactory getInstance() {
return this.sessionFactory;
}
@PreDestroy
public void destroy() {
this.sessionFactory.close();
}
}