Erro ao usar dois bancos de dados com JPA / Hibernate

3 respostas
R

Alguém saberia o que devo fazer para configurar 2 bancos de dados no JPA, pois quando executo a aplicação, ocorre um erro dizendo que não encontrou uma tabela, sendo que é uma tabela do banco2 e não do banco1

É como se eu tivesse que ter todos os entitys nos dois bancos de dados.

Este erro ocorre na seguinte linha de código:

factory = Persistence.createEntityManagerFactory(PU);

ERRO:

Exception in thread "Thread-4" java.lang.ExceptionInInitializerError
	at br.gov.sp.prodesp.sgmi.business.RecuperacaoBO.retornartNomeImagemPorPlacaAit(RecuperacaoBO.java:66)
	at br.gov.sp.prodesp.sgmi.gui.internalframe.RadarRecuperacaoImg$3.run(Recuperacao.java:188)
	at java.lang.Thread.run(Unknown Source)

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: DEV_PU] Unable to build Hibernate SessionFactory

at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882)
	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
	at br.gov.sp.prodesp.sgmi.dao.EntityManagerFactory.<clinit>(EntityManagerFactory.java:20)
	... 3 more

Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [tbl_empresa]

	at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:130)
	at org.hibernate.tool.schema.internal.SchemaValidatorImpl.performValidation(SchemaValidatorImpl.java:100)
	at org.hibernate.tool.schema.internal.SchemaValidatorImpl.doValidation(SchemaValidatorImpl.java:67)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:184)
	at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:64)
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:458)
	at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
... 7 more

Este é meu persistence.xml, está mapeado para dois bancos de dados, mas ao executar a aplicação é criada as tabelas nos dois bancos de dados, não sei como devo fazer para mapear as entidades para que cada uma corresponda a um banco de dados.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">


<persistence-unit name="db1_PU" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
	<properties>
		<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=db1;" />
		<property name="javax.persistence.jdbc.user" value="user1" />
		<property name="javax.persistence.jdbc.password" value="123456" />
		<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="hibernate.hbm2ddl.auto" value="update" />
	</properties>
</persistence-unit>


<persistence-unit name="db2_PU" transaction-type="RESOURCE_LOCAL"> 
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
	<properties>
		<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=db2;" />
		<property name="javax.persistence.jdbc.user" value="user2" />
		<property name="javax.persistence.jdbc.password" value="123456" />
		<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="hibernate.hbm2ddl.auto" value="validate" />
	</properties>
</persistence-unit>

3 Respostas

L

Como está seu persistence.xml? Se você desligar o hbm2ddl funciona?

R

Este é meu persistence.xml, está mapeado para dois bancos de dados, mas ao executar a aplicação é criada as tabelas nos dois bancos de dados, não sei como devo fazer para mapear as entidades para que cada uma corresponda a um banco de dados.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
	xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">


<persistence-unit name="db1_PU" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
	<properties>
		<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=db1;" />
		<property name="javax.persistence.jdbc.user" value="user1" />
		<property name="javax.persistence.jdbc.password" value="123456" />
		<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="hibernate.hbm2ddl.auto" value="update" />
	</properties>
</persistence-unit>


<persistence-unit name="db2_PU" transaction-type="RESOURCE_LOCAL"> 
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	
	<properties>
		<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=db2;" />
		<property name="javax.persistence.jdbc.user" value="user2" />
		<property name="javax.persistence.jdbc.password" value="123456" />
		<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="hibernate.hbm2ddl.auto" value="validate" />
	</properties>
</persistence-unit>
L

No seu persistence.xml, cada unidade de persistência deve conter a tag para descrever a qual PU a classe pertence. Por exemplo:

<persistence-unit name="db1_PU" transaction-type="RESOURCE_LOCAL">
	<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<class>br.com.pacote.classe1</class>
<class>br.com.pacote.classe2</class>
<class>br.com.pacote.classe3</class>
	<properties>
		<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=db1;" />
		<property name="javax.persistence.jdbc.user" value="user1" />
		<property name="javax.persistence.jdbc.password" value="123456" />
		<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
		<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
		<property name="hibernate.show_sql" value="true" />
		<property name="hibernate.format_sql" value="true" />
		<property name="hibernate.hbm2ddl.auto" value="update" />
	</properties>
</persistence-unit>
Criado 6 de maio de 2016
Ultima resposta 18 de mai. de 2016
Respostas 3
Participantes 2