Como utilizar JPA em 2 servidores diferentes?

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 ?

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

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

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!

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 ?

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.

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

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

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 ?

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!