Fórum Problema ao utilizar 2 banco de dados ao mesmo tempo. #9425

21/09/2009

0

Bom dia pessoal, estou com um probleminha aqui. Tentei rodar uma aplicação que eu estou fazendo, porém está dando um erro. E eu acho que seja em um dos relacionamentos. O erro que da é o seguinte: view plaincopy to clipboardprint? javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not load an entity: [entity.Viagem#2] at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:202) at br.gov.ce.srh.siscontv.util.JPAUtil.getEntity(JPAUtil.java:62) at br.gov.ce.srh.siscontv.model.DAO.ViagemDAO.buscarViagem(ViagemDAO.java:17) at teste.ViagemDAOTeste.testbuscarViagem(ViagemDAOTeste.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [entity.Viagem#2] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.loadEntity(Loader.java:1899) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3062) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:843) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:836) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182) ... 27 more Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "[" Posição: 1616 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) at org.hibernate.loader.Loader.getResultSet(Loader.java:1812) at org.hibernate.loader.Loader.doQuery(Loader.java:697) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) at org.hibernate.loader.Loader.loadEntity(Loader.java:1885) ... 39 more s Eu estou tentando fazer um teste com o JUnitTest. Aqui está o sql que ele gera para dar o erro acima: view plaincopy to clipboardprint? Hibernate: select viagem0_.pktbsisc_viagem as pktbsisc1_4_4_, viagem0_.dt_periodofinal as dt2_4_4_, viagem0_.dt_periodoinicial as dt3_4_4_, viagem0_.pktbsisc_cod_estado as pktbsisc15_4_4_, viagem0_.in_interno as in4_4_4_, viagem0_.ds_cidade as ds5_4_4_, viagem0_.ds_pessoa as ds6_4_4_, viagem0_.ds_objetivo as ds7_4_4_, viagem0_.in_ajudacusto as in8_4_4_, viagem0_.in_diaria as in9_4_4_, viagem0_.in_passagem as in10_4_4_, viagem0_.in_coletiva as in11_4_4_, viagem0_.vl_ajudacusto as vl12_4_4_, viagem0_.vl_diaria as vl13_4_4_, viagem0_.vl_passagens as vl14_4_4_, estado1_.pktbsisc_cod_estado as pktbsisc1_3_0_, estado1_.ds_estado as ds2_3_0_, estado1_.pktbsisc_cod_pais as pktbsisc3_3_0_, pais2_.pktbsisc_cod_pais as pktbsisc1_8_1_, pais2_.ds_pais as ds2_8_1_, solicitaca3_.pktbsisc_solicitacao as pktbsisc1_2_2_, solicitaca3_.dt_solicitacao as dt2_2_2_, solicitaca3_.ds_justificativa as ds3_2_2_, solicitaca3_.in_status as in4_2_2_, solicitaca3_.in_relatorioviagem as in5_2_2_, solicitaca3_.pktbsisc_usuario as pktbsisc6_2_2_, solicitaca3_.pktbsisc_viagem as pktbsisc7_2_2_, usuario4_.Ds_Login as Ds1_6_3_, usuario4_.NOME as NOME6_3_, usuario4_.MATRÍCULA as MATRÍCULA6_3_, usuario4_."UNIDADE DE EXERCÍCIO" as UNIDADE4_6_3_, usuario4_.tipo_usuario as tipo5_6_3_ from teste.tbsisc_viagem viagem0_ left outer join teste.tbsisc_estado estado1_ on viagem0_.pktbsisc_cod_estado=estado1_.pktbsisc_cod_estado left outer join teste.tbsisc_pais pais2_ on estado1_.pktbsisc_cod_pais=pais2_.pktbsisc_cod_pais left outer join teste.tbsisc_solicitacao solicitaca3_ on viagem0_.pktbsisc_viagem=solicitaca3_.pktbsisc_viagem left outer join [DADOS DO SERVIDOR] usuario4_ on solicitaca3_.pktbsisc_usuario=usuario4_.Ds_Login where viagem0_.pktbsisc_viagem=? A minha dúvida é, tenho 2 relacionamentos abaixo, tem algo de errado neles? view plaincopy to clipboardprint? class Usuario @ManyToMany(targetEntity=Grupo.class,mappedBy="listaUsuarios") @JoinTable(name="tbsisc_usuario_grupo") private List listGrupos; @OneToMany(mappedBy="usuario") private List listaSolicitacao = new LinkedList(); view plaincopy to clipboardprint? class Solicitacao @ManyToOne @JoinColumn(name="pktbsisc_usuario") private Usuario usuario; view plaincopy to clipboardprint? class Grupo @ManyToMany(targetEntity = Usuario.class) @JoinTable(name = "tbsisc_usuario_grupo", joinColumns = @JoinColumn(name = "id_usuario"), inverseJoinColumns = @JoinColumn(name = "id_grupo")) private List listaUsuarios = new LinkedList(); Quero explicar que tenho 3 bancos: "bancoLocal" , "BDSERV" , "BDINTR". [DADOS DO SERVIDOR] é uma tabela de um banco. Esqueci de comentar um seguinte problema, eu estou tentando acessar 2 bancos de dados ao mesmo tempo, pois eu preciso dos dados dos 2. Eu só não entendi pq ele tenta dar um lefjoin no dados do servidor, pois é de outro banco. A classe Usuario é entidade do banco "BDSERV" que contém a tabela [DADOS DO SERVIDOR] e as demais é de outro banco, "bancoLocal", que contém as demais tabelas, viagem, grupo, etc ... Aqui está meu persiste.xml view plaincopy to clipboardprint? org.hibernate.ejb.HibernatePersistence entity.Grupo entity.AndamentoSolicitacao entity.Solicitacao entity.Estado entity.Viagem org.hibernate.ejb.HibernatePersistence entity.Usuario org.hibernate.ejb.HibernatePersistence entity.Setor
Euclides Filizola

Euclides Filizola

Responder

Posts

21/09/2009

Henrique Weissmann

Euclides, verifique isto:

se você está trabalhando com dois bancos de dados distintos, ao definir qual a tabela do banco de dados, preceda seu nome pelo nome do banco de dados, tal como na sintaxe abaixo:

[nome do banco de dados].[nome da tabela].

Neste caso, sugiro inclusive que você faça isto para todas as suas classes de entidade para evitar problemas.

É o que costumo fazer no Hibernate para casos como estes.
Responder

Gostei + 0

21/09/2009

Euclides Filizola

Fala Henrique beleza ? Mano, mas eu não estou utilizando o Hibernate, apenas o JPA. e implemento o Hibernate. É a mesma coisa ?
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Mesmíssima história.

Lembre-se: o JPA é apenas uma camada colocada acima do Hibernate para que um dia, caso você queira mudar o seu motor de persistência (por exemplo, passar de Hibernate para TopLink).
Responder

Gostei + 0

21/09/2009

Euclides Filizola

Você está dizendo fazer isso ? @Entity @Table(name="SISCONTV.teste.tbsisc_solicitacao") public class Solicitacao implements Serializable { ... ? ao invés de: @Entity @Table(name="teste.tbsisc_solicitacao") public class Solicitacao implements Serializable { ... ?
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Se SISCONTV for o nome do banco de dados, é exatamente isto.
Responder

Gostei + 0

21/09/2009

Euclides Filizola

Acabei de fazer as mudanças, continua o mesmo erro. javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not load an entity: [entity.Viagem#2] at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:202) at br.gov.ce.srh.siscontv.util.JPAUtil.getEntity(JPAUtil.java:62) at br.gov.ce.srh.siscontv.model.DAO.ViagemDAO.buscarViagem(ViagemDAO.java:17) at teste.ViagemDAOTeste.testbuscarViagem(ViagemDAOTeste.java:58) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [entity.Viagem#2] at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.loadEntity(Loader.java:1899) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:71) at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:65) at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3062) at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:434) at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:415) at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:165) at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:223) at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:126) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:843) at org.hibernate.impl.SessionImpl.get(SessionImpl.java:836) at org.hibernate.ejb.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:182) ... 27 more Caused by: org.postgresql.util.PSQLException: ERRO: erro de sintaxe em ou próximo a "[" Posição: 1659 at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2062) at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1795) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:479) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:367) at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) at org.hibernate.loader.Loader.getResultSet(Loader.java:1812) at org.hibernate.loader.Loader.doQuery(Loader.java:697) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) at org.hibernate.loader.Loader.loadEntity(Loader.java:1885) ... 39 more .... esse erro pelo que eu vi, ele tenta fazer um join com o outro banco. Aqui está o sql que o hibernate gera: select viagem0_.pktbsisc_viagem as pktbsisc1_4_4_, viagem0_.dt_periodofinal as dt2_4_4_, viagem0_.dt_periodoinicial as dt3_4_4_, viagem0_.pktbsisc_cod_estado as pktbsisc15_4_4_, viagem0_.in_interno as in4_4_4_, viagem0_.ds_cidade as ds5_4_4_, viagem0_.ds_pessoa as ds6_4_4_, viagem0_.ds_objetivo as ds7_4_4_, viagem0_.in_ajudacusto as in8_4_4_, viagem0_.in_diaria as in9_4_4_, viagem0_.in_passagem as in10_4_4_, viagem0_.in_coletiva as in11_4_4_, viagem0_.vl_ajudacusto as vl12_4_4_, viagem0_.vl_diaria as vl13_4_4_, viagem0_.vl_passagens as vl14_4_4_, estado1_.pktbsisc_cod_estado as pktbsisc1_3_0_, estado1_.ds_estado as ds2_3_0_, estado1_.pktbsisc_cod_pais as pktbsisc3_3_0_, pais2_.pktbsisc_cod_pais as pktbsisc1_8_1_, pais2_.ds_pais as ds2_8_1_, solicitaca3_.pktbsisc_solicitacao as pktbsisc1_2_2_, solicitaca3_.dt_solicitacao as dt2_2_2_, solicitaca3_.ds_justificativa as ds3_2_2_, solicitaca3_.in_status as in4_2_2_, solicitaca3_.in_relatorioviagem as in5_2_2_, solicitaca3_.pktbsisc_usuario as pktbsisc6_2_2_, solicitaca3_.pktbsisc_viagem as pktbsisc7_2_2_, usuario4_.Ds_Login as Ds1_6_3_, usuario4_.NOME as NOME6_3_, usuario4_.MATRÍCULA as MATRÍCULA6_3_, usuario4_."UNIDADE DE EXERCÍCIO" as UNIDADE4_6_3_, usuario4_.tipo_usuario as tipo5_6_3_ from SISCONTV.teste.tbsisc_viagem viagem0_ left outer join SISCONTV.teste.tbsisc_estado estado1_ on viagem0_.pktbsisc_cod_estado=estado1_.pktbsisc_cod_estado left outer join SISCONTV.teste.tbsisc_pais pais2_ on estado1_.pktbsisc_cod_pais=pais2_.pktbsisc_cod_pais left outer join SISCONTV.teste.tbsisc_solicitacao solicitaca3_ on viagem0_.pktbsisc_viagem=solicitaca3_.pktbsisc_viagem left outer join bdserv.[DADOS DO SERVIDOR] usuario4_ on solicitaca3_.pktbsisc_usuario=usuario4_.Ds_Login where viagem0_.pktbsisc_viagem=? ........... Mas não sei como ele vai acessar o "bdserv.[DADOS DO SERVIDOR]", já que as duas tabelas estão em bancos diferentes... é isso que ta me trazendo problemas... .....
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Os dois bancos de dados estão no mesmo servidor?

Sugestão: execute este SQL no seu próprio banco de dados e veja se vai dar algum erro.
Caso execute normalmente, pode ser que o problema não seja este, mas sim outro.

Verifique também se você está mapeando a sua entidade corretamente no arquivo de configuração do JPA.
Responder

Gostei + 0

21/09/2009

Euclides Filizola

Não, os dois bancos não estão no mesmo servidor. Um deles está em localhost, e o outro está fora. Aqui está meu persistence.xml org.hibernate.ejb.HibernatePersistence entity.Grupo entity.AndamentoSolicitacao entity.Solicitacao entity.Estado entity.Viagem org.hibernate.ejb.HibernatePersistence entity.Usuario org.hibernate.ejb.HibernatePersistence entity.Setor ........
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Então este é o seu problema.

Uma das limitações do JPA (e Hibernate) é justamente esta. Ou todas as entidades estão no mesmo servidor ou não. Caso não estejam, normalmente ele não irá conseguir fazer o mapeamento.

Imagine-se executando esta consulta no seu servidor. Fazendo o join de tabelas presentes neste servidor com tabelas presentes em outra. Como são instâncias distintas, armazenadas em locais completamente distintos, a consulta irá lhe retornar um erro, informando ou que um dos bancos de dados não existe ou que não há registros referentes em um dos lados do join.
Responder

Gostei + 0

21/09/2009

Euclides Filizola

Eita.... e agora ? O que eu vou fazer ?
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Neste caso você vai ter de pensar em uma abordagem alternativa.

Se um dos bancos de dados estiver por exemplo apenas na sua máquina temporáriamente, isto é, se posteriormente ele for ser incorporado no servidor central, faça uma cópia do banco de dados remoto para o seu computador e trabalhe como mencionei com você anteriormente.

Posteriormente, quando o seu sistema estiver pronto, o banco de dados da sua máquina estará no servidor e o problema será resolvido.

Agora, caso os bancos de dados sempre venham a se encontrar em servidores distintos, e não apenas em tempo de desenvolvimento, a coisa se complica BEM mais, pois você terá de pensar em alguma estratégia de integração entre os dois, e o JPA só poderá ser aplicado em entidades nas quais 100% dos seus dados se encontrem no mesmo servidor.
Responder

Gostei + 0

21/09/2009

Euclides Filizola

P**. E me diz uma coisa, me falaram de um tal de DBLink, que com ele, eu conseguiria fazer os dois bancos se enxergarem, ele vai servir no meu caso ? Vai funcionar perfeitamente ?
Responder

Gostei + 0

21/09/2009

Henrique Weissmann

Euclides,

não conheço o DBLink, mas o pessoal do Hibernate tem um produto chamado Hibernate Shards, cujo objetivo é mais ou menos este. O link para o produto é https://www.hibernate.org/414.html

Infelizmente, assim como no caso do DBLink, nunca trabalhei com esta ferramenta.
Responder

Gostei + 0

22/09/2009

Euclides Filizola

Eu ouvi falar que daria para resolver o problema utilizanto data-sources.  Você saberia me informar ? 
Responder

Gostei + 0

22/09/2009

Euclides Filizola

Eu ouvi falar que daria para resolver o problema utilizanto data-sources.  Você saberia me informar ? 
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar