Erro Componente Utilitario Hibernate do VRaptor

E ai Galera.

Estou com o seguinte problema,
registrei o componente opcional do Hibernate no web.xml

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.util.hibernate</param-value> </context-param>

para utilizar o interceptador de transação,
mais no momento que vou realizar uma operação de insert em uma tabela acontece a seguinte exception:

avisando que não encontra o arquivo hibernate.cfg.xml no meu projeto, mas minha aplicação está utilizando uma
classe Hibernate util para realizar a conexão e configuração do projeto.

HibernateUtil

public class HibernateUtil {

	private static final SessionFactory sessionFactory = buildSessionFactory();

	public static Configuration getConfiguration() {
		try {
			return new Configuration()
    		.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver")
    		.setProperty("hibernate.connection.url", "jdbc:oracle:thin:@0.0.0.0:1521:XXX")
    		.setProperty("hibernate.dialect", "org.hibernate.dialect.OracleDialect")
    		.setProperty("hibernate.connection.username", "usuario")
    		.setProperty("hibernate.connection.password", "senha")
    		.setProperty("hibernate.show_sql", "true")
    		.setProperty("hibernate.format_sql", "true")
    		.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider")
    		.setProperty("hibernate.c3p0.min_size", "5")
    		.setProperty("hibernate.c3p0.max_size", "40")
    		.setProperty("hibernate.c3p0.timeout", "300")
    		.setProperty("hibernate.c3p0.max_statements", "300")
    		.setProperty("hibernate.c3p0.idle_test_period", "100")
    		.addAnnotatedClass(Filial.class)
    		.addAnnotatedClass(ViewEmpresas.class)
    		.addAnnotatedClass(ConhecimentoTrasporte.class)
    		.addAnnotatedClass(Acr4200.class)
    		.addAnnotatedClass(Acr4300.class)
    		.addAnnotatedClass(ViewCtrEmAberto.class)
    		.addAnnotatedClass(UsuarioLogin.class)
    		.addAnnotatedClass(Motoristas.class)
    		.addAnnotatedClass(BaixaCtrTransporte.class);
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	private static SessionFactory buildSessionFactory() {
		return getConfiguration().buildSessionFactory();
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

ksio_thadeu,

A mensagem informa que não encontrou o “hibernate.cfg.xml”. Você tem certeza de que você criou esse arquivo e que ele está no local correto?

Sds,
Almir.

Eu não criei o arquivo, pois realizei toda a configuração na classe HibernateUtil

se vc vai usar esse HibernateUtil do jeito que está, tire o pacote do hibernate do web.xml…

mas o ideal é vc colocar isso na injeção de dependências, criando um ComponentFactory… ou movendo essas configurações pro xml e mantendo o pacote no web.xml

Mas se eu criar uma componentFactory onde eu devo realizar as configurações de conexão e a vinculação das classe para o Hibernate? E eu devo manter o pacote no web.xml?

não… vc tem que tirar o pacote do web.xml, criar uma ComponentFactory pra SessionFactory, uma pra Session e o interceptor de transação…

https://github.com/caelum/vraptor/blob/master/vraptor-site/src/content/javadoc/br/com/caelum/vraptor/util/hibernate/SessionFactoryCreator.html

https://github.com/caelum/vraptor/blob/master/vraptor-site/src/content/javadoc/br/com/caelum/vraptor/util/hibernate/SessionCreator.html

https://github.com/caelum/vraptor/blob/master/vraptor-site/src/content/javadoc/br/com/caelum/vraptor/util/hibernate/HibernateTransactionInterceptor.html

copie essas classe e mude o SessionFactoryCreator pra usar o HibernateUtil (ou transforme o hibernate util nele)

cuidado pra não criar a sessionFactory toda hora.

Lucas como devo fazer para ele abrir a sessão, a session factroy esta abrindo normalmente,

possuo a seguinte classe que é meu DAOGenerico, todos os outros DAO são filhas de HibernateGenericDAO,

public abstract class GenericHibernateDAO<T, ID extends Serializable>
		implements DAO<T, ID> {

	private Class<T> persistentClass;
	private Session session;

	@SuppressWarnings("unchecked")
	public GenericHibernateDAO() {
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
		
	}

	public void setSession(Session s) {
		this.session = s;
	}

	@Override
	public Session getSession() {
		return session;
	}

	public Class<T> getPersistentClass() {
		return persistentClass;
	}

	@Override
	@SuppressWarnings("unchecked")
	public T findById(ID id, boolean lock) {
		T entity;
		if (lock)
			entity = (T) getSession().get(getPersistentClass(), id,
					LockOptions.UPGRADE);
		else
			entity = (T) getSession().get(getPersistentClass(), id);
		return entity;
	}

	@Override
	@SuppressWarnings("unchecked")
	public T loadById(ID id, boolean lock) {
		T entity;
		if (lock)
			entity = (T) getSession().load(getPersistentClass(), id,
					LockOptions.UPGRADE);
		else
			entity = (T) getSession().load(getPersistentClass(), id);
		return entity;
	}

	@Override
	public List<T> findAll() {
		return findByCriteria();
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<T> findByExample(T exampleInstance, String... excludeProperty) {
		Criteria crit = getSession().createCriteria(getPersistentClass());
		Example example = Example.create(exampleInstance);
		for (String exclude : excludeProperty) {
			example.excludeProperty(exclude);
		}
		crit.add(example);
		return crit.list();
	}

	@Override
	public T makePersistent(T entity) {
		getSession().saveOrUpdate(entity);
		return entity;
	}

	@Override
	public T makeMerged(T entity) {
		getSession().merge(entity);
		return entity;
	}

	@Override
	public void makeTransient(T entity) {
		getSession().delete(entity);
	}

	@Override
	public void flush() {
		getSession().flush();
	}

	@Override
	public void clear() {
		getSession().clear();
	}

	@Override
	public Connection close() {
		return getSession().close();
	}

	/**
	 * Use this inside subclasses as a convenience method.
	 */
	@SuppressWarnings("unchecked")
	protected List<T> findByCriteria(Criterion... criterion) {
		Criteria crit = getSession().createCriteria(getPersistentClass());
		for (Criterion c : criterion) {
			crit.add(c);
		}
		return crit.list();
	}

Classe filha da HibernateGenericDAO

public class UsuarioLoginDAOImpl extends
		GenericHibernateDAO<UsuarioLogin, Long> implements UsuarioLoginDAO {

	@Override
	public UsuarioLogin login(UsuarioLogin usuarioLogin) {
		Criteria createCriteria = this
				.getSession()
				.createCriteria(UsuarioLogin.class, "u")
				.add(Restrictions.eq("u.usuario", usuarioLogin.getUsuario()
						.toUpperCase()))
				.add(Restrictions.eq("u.senha", usuarioLogin.getSenha()
						.toUpperCase()));
		return (UsuarioLogin) createCriteria.uniqueResult();
	}

Eu devo fazer a injeção da session, ou ela era para ser aberta normalmente?

o ideal era receber a Session pelo construtor… mas vc pode colocar @Inject no setSession()

Eu estou utilizando o VRaptor 3.4.1, mas não estou encontrando a anotação @Inject

usa @Autowired, se vc estiver usando o spring.