JPA não reconhece JDNI (Resolvido)

Boa tarde.
Estou começando a utilizar JPA mas estou apanhando um pouco.
Instalei o Jboss application server 7.1 e criei um datasource que está se comunicando com um banco de dados sql server 2008.

Segue o codigo do arquivo standalone.xml:

                <datasource jta="true" jndi-name="java:jboss/datasources/Banco" pool-name="Banco" enabled="true" use-ccm="false">
                    <connection-url>jdbc:sqlserver://10.25.3.5:1433;DatabaseName=BancoTeste</connection-url>
                    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
                    <driver>sqljdbc4.jar</driver>
                    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                    <pool>
                        <min-pool-size>10</min-pool-size>
                        <max-pool-size>20</max-pool-size>
                        <prefill>true</prefill>
                    </pool>
                    <security>
                        <user-name>sa</user-name>
                        <password>123456</password>
                    </security>
                    <validation>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </datasource>

Quando eu testo a conexão pelo jboss ele diz que criou a conexão com sucesso.

Porém, quando eu coloco o jndi no persistence.xml ele retorna um erro.

Segue o codigo do persistence:

<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/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="Sistema" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:jboss/datasources/Banco</jta-data-source>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
			<property name="hibernate.hbm2ddl.auto" value="none" />
		</properties>
	</persistence-unit>
</persistence>

Segue o erro:

Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: Sistema] Unable to build EntityManagerFactory
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890)
	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.com.Conexao.<init>(Conexao.java:21)
	at br.com.dao.DaoLogradouro.<init>(DaoLogradouro.java:17)
	at br.com.Teste.main(Teste.java:16)
Caused by: org.hibernate.service.jndi.JndiException: Error parsing JNDI name [java:jboss/datasources/Banco]
	at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:92)
	at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:63)
	at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
	at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
	at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
	at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
	at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
	at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
	at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:77)
	at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
	at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
	at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905)
	... 7 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.getNameParser(Unknown Source)
	at org.hibernate.service.jndi.internal.JndiServiceImpl.parseName(JndiServiceImpl.java:86)
	... 23 more

O erro ocorre quando eu tento criar uma factory:

EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("Sistema");

Não sei se precisa instalar mais alguma coisa para o jndi funcionar ou se a configuração está errada.

No aguardo. Desde já obrigado.

Cara, tente apenas renomear seu datasoure.

Olhe a mensagem de erro: Error parsing JNDI name [java:jboss/datasources/Banco]

Alterei o nome no persistence e no jboss para java:jboss/Banco mas continua o mesmo erro.

Será que está faltando algum programa para funcionar? Estou fazendo algum procedimento errado?

Obrigado pela resposta.

[quote=rkrterada]Alterei o nome no persistence e no jboss para java:jboss/Banco mas continua o mesmo erro.

Será que está faltando algum programa para funcionar? Estou fazendo algum procedimento errado?

Obrigado pela resposta.
[/quote]Continou a mesma mensagem de erro?

Sim. Error parsing JNDI name [java:jboss/Banco].

Tente nomear com: java:/MeuDataSource

Mesmo erro. Error parsing JNDI name [java:/Banco].

Ultima tentativa, tente: java:jboss/datasources/CrudDS

E no persistence apenas por CrudDS

Mesmo erro. Nossa to quase desistindo.

Está tudo local, menos o banco de dados.

Não sei mais o que fazer.

Obrigado

Um chute… você está usando a tag <jta-data-source> e tentando pegar o EntityManagerFactory via Factory. Nesse caso você deveria usar <non-jta-data-source>.

Fiz esse teste também e deu o mesmo erro.

Estou migrando para o hibernate.cfg.xml. Será que pode resolver?

Obrigado

No log de subida do JBoss você vê a inicialização deste dataSource?

Você consegue pegar o dataSource via initialContext?

InitialContext ic = new InitialContext().
DataSource ds = (DataSource) ic.lookup("java:jboss/Banco");
Connection conn = ds.getConnetcion();

Eu vejo o datasource na subida.

Na linha ic.lookup gerou o seguinte erro.

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 br.com.Teste.main(Teste.java:26)

obrigado

Este último erro diz que os jars que permitem a conexão remota ao JBoss não estão no classpath.
Perguntas elementares, você criou o arquivo jboss-ejb-client.properties?

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
 
remote.connections=default
 
remote.connection.default.host=127.0.0.1
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

E adicionou os jars:

jboss-ejb-client-1.0.5.Final jboss-logging-3.1.0.GA jboss-marshalling-1.3.11.GA jboss-marshalling-river-1.3.11.GA jboss-remoting-3.2.3.GA xnio-api-3.0.3.GA xnio-nio-3.0.3.GA ao classpath?

Cara, não fiz isso não. Coloquei apenas um jar lá do jboss.

Não sabia que precisava de todos esses. E onde que eu coloco esse arquivo de properties?

Pena que eu não estou mais no trabalho, mas segunda-feira eu testo e respondo aqui.

Obrigadão. Desculpa a minha ignorância.

O arquivo de propriedades ficará na pasta src e os jars são necessários.
Tive algumas dores de cabeça com isso já.

Bom dia. Adicionei os jars e o arquivo properties no projeto.
Porém está dando um erro ainda na linha:

DataSource ds = (DataSource) ic.lookup("java:jboss/Banco");.

Erro:

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 br.com.Teste.main(Teste.java:29)

Obrigado

Camarada, até o momento não entendi direito o que você quer. Está tentando fazer uma requisição, via jndi, para o data source?

Boa tarde.

Deixa eu explicar. Eu sou novo com hibernate. Então eu estou migrando 2 aplicações que acessam bancos diferentes. Elas estão em VB 6.0 e estou migrando para java. Só que o sistema Cliente tem um campo CodLogradouro que faz referencia a tabela logradouro da outra aplicação. Essa relação é controlada pelos sistemas, no banco não há relação.

Por exemplo: Tenho 2 bancos de dados. Cliente e Logradouro.
1 - Cliente
Codigo
Nome
CodLogradouro

2 - Logradouro
CodLogradouro
Descricao

Tenho 2 projetos: Cliente e Logradouro, mas gostaria que o projeto Cliente acessasse o projeto Logradouro e a classe cliente tivesse uma composição da classe logradouro e que o hibernate gerenciasse isso.
Então eu li que eu deveria criar um pool de conexões.
Então eu instalei o Jboss Aplicattion Server 7.1 e configurei um datasource.
E agora estou tentando rodar o meu sistema utilizando um JNDI no persistence.xml.
Não sei sei se estou viajando, se tem outra maneira de fazer.

Não sei se ficou claro.
Obrigado

Java web ou desktop?