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?
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.