JNDI + JPA 2 + Tomcat 7

1 resposta
Z

Olá Amigos,

Estou tentando configurar o JPA 2 com datasource, a minha aplicação tem a seguinte tecnologia: jsf 2, Hibernate 3.6.7, tomcat 7 utilizando eclipse indigo

Quando vou fazer um exemplo básico sem utilizar data source funciona bem com a seguinte configuração

persistence.xml localizado no META-INF
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/s/persistence/persistence_1_0.xsd"
	version="1.0">

	<persistence-unit name="sei_hibernate"
		transaction-type="RESOURCE_LOCAL">
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
			<property name="javax.persistence.jdbc.user" value="user" />
			<property name="javax.persistence.jdbc.password" value="123" />
			<property name="javax.persistence.jdbc.url"
				value="jdbc:postgresql://localhost:5432/notasfiscais" />
		</properties>
	</persistence-unit>

</persistence>

para testar se a conexão com o banco utilizo

package br.zenas.teste; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;

public class TesteDaJPAConfigBanco {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("sei_hibernate");
EntityManager em = emf.createEntityManager();


em.close();
emf.close();

}

}

Sem quando tento utilizar o data source, não funciona de jeito nenhum
utilizei os seguintes passos dos site's

http://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/configuration.html
http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html

me data source no tomcat está da seguinte forma

Web Database jdbc/seiweb_jndi javax.sql.DataSource Container

meu persistence que estava funcionando da maneira sem o data source

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">

org.hibernate.ejb.HibernatePersistence
java:/seiweb_jndi






classe de teste

package br.zenas.teste; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence;

public class TesteDaJPAConfigBanco {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EntityManagerFactory emf = Persistence
.createEntityManagerFactory("sample");
EntityManager em = emf.createEntityManager();


em.close();
emf.close();

}

}

quando eu subo o servidor e rodo a classe de teste me é apresentado o seguinte erro

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/campanhaeleitoral/sei_hibernate/lib/slf4j-jdk14-1.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/campanhaeleitoral/sei_hibernate/lib/slf4j-log4j12-1.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/campanhaeleitoral/teste/WebContent/WEB-INF/lib/slf4j-jdk14-1.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/campanhaeleitoral/teste/WebContent/WEB-INF/lib/slf4j-log4j12-1.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
03/09/2011 14:22:28 org.hibernate.annotations.common.Version
INFO: Hibernate Commons Annotations 3.2.0.Final
03/09/2011 14:22:28 org.hibernate.cfg.Environment
INFO: Hibernate 3.6.7.Final
03/09/2011 14:22:28 org.hibernate.cfg.Environment
INFO: hibernate.properties not found
03/09/2011 14:22:28 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : javassist
03/09/2011 14:22:28 org.hibernate.cfg.Environment
INFO: using JDK 1.4 java.sql.Timestamp handling
03/09/2011 14:22:28 org.hibernate.ejb.Version
INFO: Hibernate EntityManager 3.6.7.Final
03/09/2011 14:22:28 org.hibernate.cfg.Configuration applyHibernateValidatorLegacyConstraintsOnDDL
INFO: Hibernate Validator not found: ignoring
03/09/2011 14:22:28 org.hibernate.cfg.search.HibernateSearchEventListenerRegister enableHibernateSearch
INFO: Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
03/09/2011 14:22:28 org.hibernate.util.NamingHelper getInitialContext
INFO: JNDI InitialContext properties:{}
03/09/2011 14:22:28 org.hibernate.connection.DatasourceConnectionProvider configure
GRAVE: Could not find datasource: java:/seiweb_jndi
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:51)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:90)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2863)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2859)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at br.zenas.teste.TesteDaJPAConfigBanco.main(TesteDaJPAConfigBanco.java:14)
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: sample] Unable to build EntityManagerFactory
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47)
at br.zenas.teste.TesteDaJPAConfigBanco.main(TesteDaJPAConfigBanco.java:14)
Caused by: org.hibernate.HibernateException: Could not find datasource
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143)
at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:51)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:90)
at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2863)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2859)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
... 4 more
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)
... 11 more

Agradeço a quem puder me ajudar.

Abraços

1 Resposta

F

Olha posso dar duas sugestões:

Primeiro não sei como você está chamando a classe de teste, mas se for do jeito que estou pensando, executando o .class por ter o método main, não funciona mesmo. O jndi está definido dentro do tomcat, logo deve ser chamado por alguma aplicação de dentro dele. A forma mais simples é criar um projetinho web com um servlet e colocar esse código de teste ai e chamar pelo browser.

Segundo, acho que a configuração está um pouco errada, ele não é JTA (não existe JTA no tomcat), seria:

<persistence-unit name="sample" transaction-type="RESOURCE_LOCAL">
...
<non-jta-data-source>java:/seiweb_jndi</non-jta-data-source>

Verifique também a sintaxe, no caso eu uso java:/comp/env/jdbc/meuDataSource

Depois dá um feedback se deu certo

abraço

Criado 3 de setembro de 2011
Ultima resposta 5 de set. de 2011
Respostas 1
Participantes 2