Como utilizar JPA em 2 servidores diferentes?

9 respostas
EuclidesFilizola

Boa tarde meus caros amigos, eu gostaria de saber como eu faço para mapear minhas entidades tendo 2 bancos em 2 servidores diferentes.

Por exemplo: Tabela Usuario, está em localhost, e a tabela Produtos, está em 172.168.0.10.

Por favor não liguem ara “usuario, produtos” e talz, é só como exemplo, gostaria de saber como faria para mapear as duas e como uma enxergaria a outra ?

Ouvi falar no dblink.

Alguém poderia me dar uma força ?

9 Respostas

yorgan

Em um caso que tive uma situação semelhante, eu utilizei uma anotação no DAO.
Essa anotação só tinha o nome do DataSource e dela eu pegava a informação para utilizar na hora de abrir a conexão.
Dessa forma cada DAO podia ter um DataSource diferente e o sistema podia utilizar N bancos.

[]´s

Daniel

odair.bonin

Na classe que trata a regra de negócio, crie o entityManager com a PersistentUnit respectiva (se voce estiver usando pool de conexão, melhor).

Tchello

Mas como ficaria o persistence.xml, por exemplo, com duas ou mais PersistencesUnits?
E qual Annotation devo utilizar nas minhas entidades pra indicar a qual PU ela pertence? Pergunto isso pq seria essencial caso eu permitisse a geração automatica de entidades no bd ao subir minha aplicação pro servidor.
Me corrijam se eu estiver incorreto, mas farei um exemplo com o que acredito que seja.
Supondo que tenha o seguinte persistence.xml:

<persistence version="1.0" 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">
  <persistence-unit name="MEU_PU1">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/BD1</jta-data-source>
    <properties>
      <property name="hibernate.archive.autodetection" value="class, hbm"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="use_sql_comments" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
    </properties>
  </persistence-unit>
<persistence-unit name="MEU_PU2">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:/BD2</jta-data-source>
    <properties>
      <property name="hibernate.archive.autodetection" value="class, hbm"/>
      <property name="hibernate.show_sql" value="true"/>
      <property name="hibernate.format_sql" value="true"/>
      <property name="use_sql_comments" value="true"/>
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
    </properties>
  </persistence-unit>
</persistence>

Está correto?!

E supondo que eu queria um EntityManager especifico pra um Persistence Unit, deveria chama-lo assim:

@PersistenceContext(unitName="MEU_PU2")
    EntityManager em;

// ou assim:

 @PersistenceContext(unitName="MEU_PU1")
    EntityManager em;

Isso está correto?!

Desculpem-me postar assim, mas estou sem tempo pra fazer testes hoje, assim que tiver os farei.
Ainda tenho duvida de qual anotação usar nas entidades, pra especificar pra qual PU elas pertencem.

Pelas minhas pesquisas aqui encontrei essa:

@PersistenceUnit(unitName="MEU_PU1")

Isso tudo que coloquei aqui foram suposições com base no que conheço e que encontrei com o auto-complete do netbeans.
A princípio me parecem corretas, mas sem um teste e sem uma bibliografia confiavel não sei dizer se estão corretas, alguém saberia me indicar?

Abraços!

EuclidesFilizola

Nesse caso, meu persistence.xml se encontra assim:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	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">
	<persistence-unit name="bancoLocal" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entity.Grupo</class>
		<class>entity.AndamentoSolicitacao</class>
		<class>entity.Solicitacao</class>
		<class>entity.Estado</class>
		<class>entity.Viagem</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.connection.username" value="postgres" />
			<property name="hibernate.connection.password" value="root" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/SISCONTV" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
			
			
		</properties>
	</persistence-unit>

	<persistence-unit name="banco2" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>entity.Usuario</class>

		<properties>
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.connection.username" value="postgres" />
			<property name="hibernate.connection.password" value="root" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/postgres" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />

		</properties>
	</persistence-unit>
</persistence>

Em que eu deveria alterar para que funcionasse dessa forma utilizando data source ?

Tchello

Se vc olhar o meu exemplo estou usando Data Source.
Basta adicionar um xml no deploy do seu JBoss (caso seja JBoss), algo como um db-ds-xml com a seguinte estrutura:

<datasources>

<local-tx-datasource>
    <jndi-name>MEU_BD1</jndi-name>
    <connection-url>jdbc:postgresql://192.168.0.1:5432/cursos</connection-url> //aqui vc coloca o ip e porta do seu bd
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>meu_usuario</user-name> //seta seu usuario
    <password>SENHA ÇECRETA!1</password> //seta sua senha
  </local-tx-datasource>

<local-tx-datasource>
    <jndi-name>MEU_BD2</jndi-name>
    <connection-url>jdbc:postgresql://192.168.0.1:5432/cursos</connection-url> //aqui vc coloca o ip e porta do seu bd
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>meu_usuario</user-name> //seta seu usuario
    <password>SENHA ÇECRETA!1</password> //seta sua senha
  </local-tx-datasource>

</datasources>

No caso, como uso PostgreSQL tenho essas configurações, mas são perfeitamente adaptaveis.
Existe um esquema de criptografar a senha no arquivo xml, talvez uma busca no google te ajude, caso queira mais esse nível de segurança.
Espero que isso lhe ajude.

EuclidesFilizola

Mas não é JBoss, eu utilizo Apache Tomcat. =(

Tchello

Bom, nunca usei com TomCat mas 2 minutos de google e achei isso:

http://snippets.dzone.com/posts/show/1595
http://markmail.org/message/rblcbwgjbxrzlxfv#query:data-source%2Btomcat+page:1+mid:kg2c5cipoqh4n67u+state:results
http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html
http://www.guj.com.br/posts/list/28992.java

EuclidesFilizola

Então deixa eu ver se eu entendi.

Eu coloco dentro do meu server.xml

o seguinte

<Context path="/someApp" docBase="someApp"
   crossContext="true" reloadable="true" debug="1">

<Resource name="jdbc/postgres" auth="Container"
          type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
          url="jdbc:postgresql://127.0.0.1:5432/mydb"
          username="myuser" password="mypasswd" maxActive="20" maxIdle="10"
maxWait="-1"/>
</Context>

Depois dentro do web.xml

coloco isso

<resource-ref>
 <description>postgreSQL Datasource example</description>
 <res-ref-name>jdbc/postgres</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

e por ultimo, chamo no meu persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
	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">
	<persistence-unit name="bancoLocal" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
               [b] <jta-data-source>jdbc/postgres</jta-data-source>[/b]
		<class>entity.Grupo</class>
		<class>entity.AndamentoSolicitacao</class>
		<class>entity.Solicitacao</class>
		<class>entity.Estado</class>
		<class>entity.Viagem</class>
		
		
		<properties>
			<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
			<property name="hibernate.connection.username" value="postgres" />
			<property name="hibernate.connection.password" value="1234" />
			<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/SISCONTV" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
		</properties>
	</persistence-unit>
	
	<persistence-unit name="BDSERV" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
                  [b] <jta-data-source>jdbc/postgres</jta-data-source>[/b]
		<class>entity.Usuario</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver" />
			<property name="hibernate.connection.username" value="User_SICV" />
			<property name="hibernate.connection.password" value="systemsicv" />
			<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://172.31.128.25/bdserv;" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		</properties>
	</persistence-unit>
	
	<persistence-unit name="BDINTR" transaction-type="JTA">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
                  [b] <jta-data-source>jdbc/postgres</jta-data-source>[/b]
		<class>entity.Setor</class>
		<properties>
			<property name="hibernate.connection.driver_class" value="net.sourceforge.jtds.jdbc.Driver" />
			<property name="hibernate.connection.username" value="User_SICV" />
			<property name="hibernate.connection.password" value="systemsicv" />
			<property name="hibernate.connection.url" value="jdbc:jtds:sqlserver://172.31.128.25/bdintr;" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		</properties>
	</persistence-unit>
</persistence>

Isso ta correto ?

Tchello

Cara, sinceramente não sei.
Mas peloq ue entendi você deve remover esse trecho:

<property name="hibernate.connection.username" value="postgres" />  
 <property name="hibernate.connection.password" value="1234" />  
 <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/SISCONTV"

E adicionar o seu DataSource Name (JNDI):

<jta-data-source>java:/BD1</jta-data-source>

Não sei se está certo, recomendo mais pesquisas.
Se funcionar posta aqui pra quem consultar futuramente!

Criado 21 de setembro de 2009
Ultima resposta 22 de set. de 2009
Respostas 9
Participantes 4