Mapeando Hibernate/JPA para bases diferentes em servidores diferentes

Java

12/03/2010

  Bom dia pessoal,

me deparei com o seguinte problema:

eu tenho uma tabela chamada convenio, e tenho uma outra tabela chama setor. Porém tem um problema: A tabela convenio é de uma base chamada ( BDSIFN) e a tabela Setor é de outra base chamada ( TBSETOR) e ainda tem outro porém, a tabela convenio está em localhost ( vai ser para a aplicação local qndo estiver em produção) e a tabela setor está em um outro servidor ( 172.128.13.1)... Porém, eu criei uma tabela intermediária que serve de ligação para as duas base...


dae eu quero saber:

como eu vou mapear essa tabela intermediaria ?


já que eu não posso fazer assim:



@Entity 
@Table(name="tbsifn_conveniosetor") 
public class ConvenioSetor implements Serializable { 
 
    private static final long serialVersionUID = 1L; 
     
    @Id 
    private Integer id; 
     
    @ManyToOne 
    private Convenio codConvenio; // referente a base BDSIFN do servidor localhost( 127.0.0.1) 
     
    @ManyToOne 
    private Setor codSetor; // referente a base TBSETOR do servidor 172.128.13.1 



me falaram de eu usar a annotation @Transient, porém não vai funcionar, pois eu tenho que inserir vários setores em 1 único convenio....

Alguém saberia me dar uma dica?

aqui está as duas entidade:




Convenio


@Entity 
@Table(name="tbsifn_convenio") 
@NamedQueries({@NamedQuery(name="listarTodosConvenios", query="select conv from Convenio conv"), 
    @NamedQuery(name="buscarConveniosPorNome",query="select con from Convenio con where con.nomeConvenio like ?1")}) 
public class Convenio implements Serializable { 
 
    private static final long serialVersionUID = 1L; 
     
    @Id 
    @Column(name="cd_convenio") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Integer codConvenio; 
     
    @Column(name="ds_nome") 
    private String nomeConvenio; 
     
    @Column(name="dt_inicio") 
    private Date dataInicio; 
         
    @Column(name="dt_final") 
    private Date dataFinal; 
     
    @ManyToOne 
    @JoinColumn(name="cd_programa") 
    private Programa codPrograma; 
     
    @Column(name="nm_sic") 
    private Integer numSIC; 
 
 
...  // GETTERS AND SETTERS ... 






Setor


@Entity 
@Table(name="TBSITE_SETORES") 
@NamedQueries({@NamedQuery(name="procurarSetor",query="select sel from Setor sel where sel.siglaSetor like ?1"), 
@NamedQuery(name="procurarCodigoSetor",query="select sec from Setor sec where sec.cdSetor like ?1"),     
@NamedQuery(name="procurarChefe",query="select sector from Setor sector where sector.cdSub like ?1"), 
@NamedQuery(name="listarTodosSetores",query="select sector from Setor sector") 
}) 
 
 
public class Setor implements Serializable { 
 
 
    private static final long serialVersionUID = 1L; 
     
    @Id 
    @Column(name="CD_SETOR") 
    private Integer cdSetor; 
     
    @Column(name="DS_SETOR") 
    private String dsSetor; 
     
    @Column(name="sg_Setor") 
    private String siglaSetor; 
     
    @Column(name="CD_TIPO") 
    private String cdTipo; 
     
    @Column(name="CD_SUB") 
    private String cdSub; 
 
 
 
      ........ // GETTERS... AND 
                  SETTERS ...    // 


. Alguém para me dar uma luz ?


Euclides Filizola

Euclides Filizola

Curtidas 0

Respostas

Dyego Carmo

Dyego Carmo

12/03/2010

JPA / Hibernate Normal não suporta esta operação... ENTRE servidores com o mesmo factory...

Para fazer isto ou voce vai precisar separar a sua logica ou utilize "Hibernate Shards"

Valeu !
GOSTEI 0
Euclides Filizola

Euclides Filizola

12/03/2010

  Fala Diego, beleza ? Mano, só uma dúvida, se eu utilizar o @Transient , não funciona ?
Outra coisa, o que é o Hibernate Shards ?
GOSTEI 0
Dyego Carmo

Dyego Carmo

12/03/2010

@Trasient é para dados em tabelas que não vao ser persistidos... ou seja o hibernate vai hignorar quando for gravar algo em disco...


Hibernate Shards é um framework para utilizar "varios servidores hibernate" de uma forma unificada.


GOSTEI 0
Carlos Mazzi

Carlos Mazzi

12/03/2010

E se vc criar outra Factory?
GOSTEI 0
Euclides Filizola

Euclides Filizola

12/03/2010

deixa eu explicar como ta o meu codigo.

tenho 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="BDSIFN" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>patrimonio.entidade.Fornecedor</class>
        <class>patrimonio.entidade.Convenio</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/BDSIFN" />
            <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="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        
        <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="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>entidade.Convenio</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>





Dae eu tenho 2 entidades:


@Entity  @Table(name="tbsifn_convenio")  @NamedQueries({@NamedQuery(name="listarTodosConvenios", query="select conv from Convenio conv"),      @NamedQuery(name="buscarConveniosPorNome",query="select con from Convenio con where con.nomeConvenio 
like ?1")})  public class
 Convenio implements 
Serializable {        private static final
 long serialVersionUID = 1L;            @Id      @Column(name="cd_convenio")      @GeneratedValue(strategy=GenerationType.IDENTITY)      private Integer 
codConvenio;            @Column(name="ds_nome")      private String 
nomeConvenio;            @Column(name="dt_inicio")      private Date 
dataInicio;                @Column(name="dt_final")      private Date 
dataFinal;            @ManyToOne      @JoinColumn(name="cd_programa")      private 
Programa codPrograma;            @Column(name="nm_sic")      private Integer numSIC;  






e esta:

@Entity  @Table(name="TBSITE_SETORES")  @NamedQueries({@NamedQuery(name="procurarSetor",query="select sel from Setor sel where sel.siglaSetor like ?1"),  @NamedQuery(name="procurarCodigoSetor",query="select sec from Setor sec where sec.cdSetor like ?1"),      @NamedQuery(name="procurarChefe",query="select sector from Setor sector where sector.cdSub like 
?1"),  @NamedQuery(name="listarTodosSetores",query="select sector from Setor sector")  })      public
 class Setor implements Serializable {          private static final
 long serialVersionUID = 1L;            @Id      @Column(name="CD_SETOR")      private Integer
 cdSetor;            @Column(name="DS_SETOR")      private String 
dsSetor;            @Column(name="sg_Setor")      private String 
siglaSetor;            @Column(name="CD_TIPO")      private String cdTipo;            @Column(name="CD_SUB")      private String
 cdSub;  




Bem, o problema é que eu tenho uma tabela intermediaria dentro do meu BDSIFN que tem ligação com o BDINTR.

Dae eu estava pensando de um jeito mapear, mas não tive nenhuma idéia legal.


@Entity  @Table(name="tbsifn_conveniosetor")  public class ConvenioSetor implements Serializable {        private static
 final long serialVersionUID = 1L;            @Id      private Integer id;            @ManyToOne      private 
Convenio codConvenio; // referente a base 
BDSIFN do servidor localhost( 127.0.0.1)            @ManyToOne      private Setor 
codSetor; // referente a base TBSETOR do 
servidor 172.128.13.1  



.. Entendeu ?
GOSTEI 0
Dyego Carmo

Dyego Carmo

12/03/2010

Isso que voce quer fazer não é possivel...

JPA não é capaz de mapear entidades "entre servidores"


GOSTEI 0
POSTAR