Mapeando Hibernate/JPA para bases diferentes em servidores diferentes
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 ?
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
Curtidas 0
Respostas
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 !
Para fazer isto ou voce vai precisar separar a sua logica ou utilize "Hibernate Shards"
Valeu !
GOSTEI 0
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 ?
Outra coisa, o que é o Hibernate Shards ?
GOSTEI 0
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.
Hibernate Shards é um framework para utilizar "varios servidores hibernate" de uma forma unificada.
GOSTEI 0
Carlos Mazzi
12/03/2010
E se vc criar outra Factory?
GOSTEI 0
Euclides Filizola
12/03/2010
deixa eu explicar como ta o meu codigo.
tenho meu persistence.xml
Dae eu tenho 2 entidades:
e esta:
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.
.. Entendeu ?
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
12/03/2010
Isso que voce quer fazer não é possivel...
JPA não é capaz de mapear entidades "entre servidores"
JPA não é capaz de mapear entidades "entre servidores"
GOSTEI 0