Usar 2 PUs em um mesmo Entity [RESOLVIDO]

8 respostas
F

Bom dia Senhores…
Gostaria de saber se tem como usar 2 Persistence Units dentro de um mesmo Entity… ex:
Tenho um Entity Person, que usa a baseA, que por sua vez mapeei em uma PU.
Só que nesse mesmo Person, ele tem um atributo Gender que está na baseB que esta mapeada em outra PU.

Quando eu tento o deploy, ele diz que na baseA não existe o Gender…

Como eu posso configurar isso no persistence.xml ??

Ou se tem como em um mesmo PU eu acessar 2 bases diferentes…

Agradeço desde já…

8 Respostas

F

Acabei conseguindo resolver…
Não sei se é a melhor prática ou se é um POG, mas funcionou aqui…
Ai vai para quem tiver o mesmo problema…

Coloquei nas 2 PUs o mapeamento das classes de ambas as bases.
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="FlexJPA">
		<jta-data-source>Corporate_Teste</jta-data-source>
		<class>br.org.novotempo.entities.Gender</class>
		<class>br.org.novotempo.entities.Person</class>
		<class>br.org.novotempo.entities.TagType</class>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>	
	</persistence-unit>
	<persistence-unit name="FlexJPA2">
		<jta-data-source>Attendance_Teste</jta-data-source>
		<class>br.org.novotempo.entities.Person</class>
		<class>br.org.novotempo.entities.TagType</class>
		<class>br.org.novotempo.entities.Gender</class>
		<exclude-unlisted-classes>false</exclude-unlisted-classes>
	</persistence-unit>
</persistence>

Entity Gender
Coloquei na Entity Gender no @Table o “catalog” com o nome da base de dados

@Entity
@Table(name = "Gender", catalog="Attendance_Teste", schema="dbo")

Ah, estou usando Toplink e Glassfish!

G

Na verdade o catalog não quer dizer o mesmo que usar usar duas PU. Catalog é qual catalog do banco essa tabela está.

Caso você queria usar duas PU basta quando você for injetar o entity-manager dizer qual PU:

@PersistenceContext(name="FlexJPA") private EntityManager em

Usar duas PU é útil quando você tem duas conexões para bancos diferentes, e afins. Talves para você funcionou apenas mudando o catalog porque você está usando o mesmo banco de dados em schemas diferentes. No caso usando duas PU distintas você tem dois acessos independentes.

Abraços

F

Oi garcia-jj,
Realmente me expressei errado…
Coincidentemente o nome do catalog era o mesmo da base e tive um falso resultado.
Testei aqui com outra base e não deu certo…
Você sabe o como eu consigo mapear essa segunda Entity vinda de um outro banco ??

F

Galera, seguinte…
Postei no forum da devMedia e o Dyego Carmo me respondeu o seguinte:

"[b]Não é possivel fazer isto que voce quer…

JPA nao suporta isso ( e nem o hibernate , para isso voce vai precisar do Hibernate Shards)

Para qualquer tipo de relecionamento voce deve estar dentro da mesma PU.[/b]"

Bom, caso alguém passe por essa mesma situação, agora já sabe.

G

kfazolin, desculpe a demora em responder, eu estava viajando. Nunca precisei de 2 PU, vou fazer amanhã uns testes e te dou um retorno. Se eu não te responder pode me cobrar por MP.

Quando ao Hibernate Shards, a informação está errada. Hibernate Shards é para particionamento horizontal, e não para usar duas bases de dados. Entenda particionamento horizontal como ter colunas de um mesmo registro em base de dados diferentes.

O projeto Hibernate shards ainda não é stable, há apenas betas e funciona com hibernate-core, e não com JPA. O Shards originalmente foi iniciado pelo Google, que doou o fonte para a Jboss tocar. Nesse artigo você vai entender melhor: http://www.cbronline.com/news/red_hats_jboss_adds_google_shards_to_hibernate

Lembre-se que o Java pode trabalhar normalmente com várias bases de dados, e via XA você pode até mesmo fazer commit em vários bancos.

Me tira uma dúvida: você precisa realmente acessar dois bancos diferentes ou são schemas diferentes no mesmo banco?

Abraços

G

Oi kfazolin. Fiz uns testes e você pode usar duas PUs, mas há um porém.

Para usar duas (ou mais) PU em um mesmo projeto basta fazer um persistence.xml como esse aqui:

<persistence ...>
    <persistence-unit name="projectA" ...>
        [...]
    </persistence-unit>

    <persistence-unit name="projectB" ...>
        [...]
    </persistence-unit>
</persistence>

E nas classes Java quando você injeta o entity-manager você precisa dizer qual a PU:

public class UserRepository {
    @PersistenceContext(name="projectA")
    EntityManager emA;

    @PersistenceContext(name="projectB")
    EntityManager emB;
}

E isso funciona bem. Fiz uns testes em um projeto que tenho aqui e que usa EJB/JPA no Glassfish e funcionou tudo bem. Você pode então ter a entidade Usuario em uma base de dados e a entidade Grupo em outra base de dados. Basta você diferenciar a PU na hora de injetar.

A limitação disso é que você não consegue fazer relacionamentos com classes de PU diferentes. No exemplo que eu te dei acima você não consegue fazer um relacionamento entre Usuario e Grupo direto na classe. Você precisará fazer o find manual.

Não sei se eu consegui te explicar, qualquer coisa, me avise.

Uma sugestão que eu te dou, se teu projeto permtir, use dblink. Assim você faz o mapeamento transparente.

Abraços

F

Oi garcia-jj (Obrigado por responder),

Então, o que eu preciso é exatamente isso

Usando JPA não consigo fazer isso ?

Infelizmente, eu uso os 2 casos, em schemas diferentes e tenho bases diferentes (Instancias de SQL Server diferentes).
Com schemas diferentes funciona tudo certinho, mas em bases diferentes não.

Abraço.

F

Oi garcia-jj,

Tinha escrito a msg acima antes de ver a sua outra resposta…

perfeito então, vou trabalhar com o find manual.

Muito obrigado pela sua ajuda…

Abraço.

Criado 24 de novembro de 2009
Ultima resposta 26 de nov. de 2009
Respostas 8
Participantes 2