Não consigo persistir dois bancos SPRING+HIBERNATE+JPA

9 respostas
metalnobre1

Ola pessoal,

Ja estou a dois dias com um problema que não consigo resolver.
No meu projeto era usado somente um banco (postgres), agora teremos que persistir em dois bancos diferentes(postgres e um banco mysql), estamos usando TransactionManager do Spring, eu consigo fazer a aplicação enchergar a base do Mysql mas não consigo inserir registros na mesma. Se alguem poder me ajudar eu agradeço bastante.

Segue codigo.

AplicattionContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

	<bean id="transactionManager1" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager1"/>

	<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory2" />
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager2"/>
	
	<context:annotation-config />	
	<!--
		Identifica os beans anotados com @Service, @Repository, @Controller
	-->
	<context:component-scan base-package="br.gov.ar" />
	
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="postgres" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="generateDdl" value="true" />
				<property name="database" value="POSTGRESQL" />
			</bean>
		</property>
	</bean>


	<bean id="entityManagerFactory2"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="arceintranet" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="generateDdl" value="true" />
				<property name="database" value="MYSQL" />
			</bean>
		</property>
	</bean>
</beans>

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="postgres">

		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		
		<class>br.gov.ar.aut.entidades.Usuario</class>
		<class>br.gov.ar.aut.entidades.Perfil</class>
		<class>br.gov.arce.aut.entidades.Menu</class>
		<class>br.gov.arce.aut.entidades.Funcao</class>
		<class>br.gov.arce.aut.entidades.File</class>
		<class>br.gov.arce.aut.entidades.Aplicacao</class>	
		<class>br.gov.ar.sp.model.Setor</class>		
		
		<properties>
			<property name="hibernate.archive.autodetection" value="off" />

			<!--Configuracoes de dialeto e conexao-->
		    <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
		    <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
			<property name="hibernate.connection.url" value="jdbc:postgresql://172.18.0.35:5432/arce"/>
			<property name="hibernate.connection.username" value="###" />
			<property name="hibernate.connection.password" value="###" />

			<!--Configuracoes de Debug-->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="use_sql_comments" value="true" />

			<property name="hibernate.hbm2ddl.auto" value="update" />

			<!--Configuração do pool de c3p0-->
			<property name="hibernate.c3p0.min_size" value="5" />
			<property name="hibernate.c3p0.max_size" value="20" />
			<property name="hibernate.c3p0.timeout" value="300" />
			<property name="hibernate.c3p0.max_statements" value="50" />
			<property name="hibernate.c3p0.idle_test_period" value="3000" />

		</properties>

	</persistence-unit>
	
	
			
	
	
	<persistence-unit name="arceintranet">

		<provider>org.hibernate.ejb.HibernatePersistence</provider>

		<class>br.gov.ar.aut.entidades.UsuarioMysql</class>
		
		<properties>
			<property name="hibernate.archive.autodetection" value="off" />

			<!--Configuracoes de dialeto e conexao-->
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost/arceintranet" />
			<property name="hibernate.connection.username" value="$$$" />
			<property name="hibernate.connection.password" value="$$$" />

			<!--Configuracoes de Debug-->
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.format_sql" value="true" />
			<property name="use_sql_comments" value="true" />

			<property name="hibernate.hbm2ddl.auto" value="update" />

			<!--Configuração do pool de c3p0-->
			<property name="hibernate.c3p0.min_size" value="5" />
			<property name="hibernate.c3p0.max_size" value="20" />
			<property name="hibernate.c3p0.timeout" value="300" />
			<property name="hibernate.c3p0.max_statements" value="50" />
			<property name="hibernate.c3p0.idle_test_period" value="3000" />

		</properties>

	</persistence-unit>

</persistence>

No DaoImpl:

@Service("baseMysqlDaoJpa")
public class BaseMysqlDaoJpa extends JpaDaoSupport implements BaseMysqlDao {
	
	private final Logger logger = Logger.getLogger(BaseMysqlDaoJpa.class.getName());
	

	/**
	 * <p>
	 * Configura o gerenciador de entidades do JPA
	 * </p>
	 * 
	 * @param emf
	 *            Gerenciador de entidades do JPA
	**/
		
	@Autowired
	public void setEntityManagerFactoryAuto(@Qualifier(value="entityManagerFactory2")EntityManagerFactory emf) {
		super.setEntityManagerFactory(emf);
	}

Obrigado Desde já.

9 Respostas

idev4web

voce disse que consegue enxergar a base mysql

o que acontece ao inserir ?

metalnobre1

A base mysql parece estar mapeada corretamente, tanto que cria as tabelas se não existirem.

Quando se persiste nenhum erro e nenhuma informação é gerada.

Obrigado.

luiscolling

metalnobre1,

Como você diz que não esta aparecendo erro, provavelmente deve estar fazendo o insert normalmente só que não deve estar fazendo um commit da transação. Eu estava com o problema parecido foi possível identificar que era a falta do commit pois quando um objeto é persistido em banco ele pega o id de uma sequence e a sequence no banco aumenta um valor.

Nunca fiz pra conectar com 2 bancos ao mesmo tempo, mas acho que é alguma coisa com o JpaTransactionManager.

metalnobre1

Pode ser falta de commit mesmo, vou pesquisar sobre JpaTransactionManager e posto aqui as informações.

Obrigado por tudo.

Masami

estou passando pelo mesmo problema.

o autor do tópico conseguiu resolver o problema? … ou alguém poderia me ajudar?

R

Para quem precisar,essa é a configuração que eu uso para acessar 2 bancos:

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
       http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd 
       http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;

	&lt;context:property-placeholder location="/WEB-INF/application.properties" /&gt;

	&lt;bean id="persistenceUnitManager"
		class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"&gt;
		 &lt;property name="persistenceXmlLocations"&gt;
			&lt;list&gt;
				&lt;value&gt;classpath*:META-INF/persistence_DBSSS.xml&lt;/value&gt;
				&lt;value&gt;classpath*:META-INF/persistence_DBCSH.xml&lt;/value&gt;
			&lt;/list&gt;
		&lt;/property&gt;

		&lt;property name="dataSources"&gt;
			&lt;map&gt;
				&lt;entry key="dataSource1" value-ref="dataSource_DBSSS" /&gt;
				&lt;entry key="dataSource2" value-ref="dataSource_DBCSH" /&gt;
			&lt;/map&gt;
		&lt;/property&gt;
	&lt;/bean&gt;	
	
	&lt;bean id="entityManagerFactory_DBSSS"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
		&lt;property name="persistenceUnitManager" ref="persistenceUnitManager" /&gt;
		&lt;property name="persistenceUnitName" value="pu_DBSSS" /&gt;
		&lt;property name="loadTimeWeaver"&gt;
    &lt;bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/&gt;
  &lt;/property&gt;
		
	&lt;/bean&gt;
	
	&lt;bean id="entityManagerFactory_DBCSH"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
		&lt;property name="persistenceUnitManager" ref="persistenceUnitManager" /&gt;
		&lt;property name="persistenceUnitName" value="pu_DBCSH" /&gt;
		&lt;property name="loadTimeWeaver"&gt;
    &lt;bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/&gt;
  &lt;/property&gt;
		
	&lt;/bean&gt;

	&lt;bean id="dataSource_DBSSS" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close"&gt;
		&lt;property name="driverClassName" value="${database.driver}" /&gt;
		&lt;property name="url" value="${dbsss.url}" /&gt;
		&lt;property name="username" value="${dbsss.username}" /&gt;
		&lt;property name="password" value="${dbsss.password}" /&gt;
	&lt;/bean&gt;
	
		&lt;bean id="dataSource_DBCSH" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close"&gt;
		&lt;property name="driverClassName" value="${database.driver}" /&gt;
		&lt;property name="url" value="${dbcsh.url}" /&gt;
		&lt;property name="username" value="${dbcsh.username}" /&gt;
		&lt;property name="password" value="${dbcsh.password}" /&gt;
	&lt;/bean&gt;
	
	&lt;bean id="txManager_DBSSS" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
		&lt;property name="entityManagerFactory" ref="entityManagerFactory_DBSSS" /&gt;
	&lt;/bean&gt;
	 
	&lt;bean id="txManager_DBCSH" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
		&lt;property name="entityManagerFactory" ref="entityManagerFactory_DBCSH" /&gt;
	&lt;/bean&gt;
	
	&lt;tx:annotation-driven transaction-manager="txManager_DBSSS" /&gt;
	&lt;tx:annotation-driven transaction-manager="txManager_DBCSH" /&gt;
	
	&lt;bean
		class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /&gt;
	&lt;bean
		class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /&gt;

	&lt;bean id="contextApplicationContextProvider" class="context.ApplicationContextProvider" /&gt;
	&lt;context:component-scan base-package="*" /&gt;
	
&lt;/beans&gt;
Masami

Rafael, poderia me dizer qual a função desta linha:

R

[quote=Masami]Rafael, poderia me dizer qual a função desta linha:

Acessar os beans do spring de qualquer ponto da aplicação:http://blog.jdevelop.eu/2008/07/06/access-the-spring-applicationcontext-from-everywhere-in-your-application/

Masami

Rafael, obrigado pela ajuda, mas com esta configuração que vc indicou não funcionou, o Spring não conseguia encontrar o 'persistence unit'.

mas consegui resolver o problema de outra maneira, adicionando o 'qualifier' no TransactionManager. ..meu arquivo de configuração do spring ficou assim:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    
    <context:annotation-config />
    <context:component-scan base-package="*" />
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    
    <tx:annotation-driven transaction-manager="transactionManager" />      
    
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>   
        <qualifier value="tm"/>
    </bean>
      
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
        <property name="dataSource" ref="dataSource" /> 
        <property name="persistenceUnitName" value="aPU" />
        <property name="jpaDialect" ref="jpaDialect" /> 
        <property name="jpaVendorAdapter"> 
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
            </bean> 
        </property> 
        <property name="loadTimeWeaver"> 
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/aaa" />
        <property name="username" value="aaaaaaa" />
        <property name="password" value="aaaaaaa" />
    </bean>
    
    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    
    
    <!--Configurações do segundo PU -->
    
    <tx:annotation-driven transaction-manager="transactionManager2" /> 
   
    <bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory2"/> 
        <qualifier value="tm2"/>
    </bean>    

    <bean id="entityManagerFactory2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
        <property name="dataSource" ref="dataSource2" /> 
        <property name="persistenceUnitName" value="bPU" />
        <property name="jpaDialect" ref="jpaDialect" /> 
        <property name="jpaVendorAdapter"> 
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
            </bean> 
        </property> 
        <property name="loadTimeWeaver"> 
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property> 
    </bean>    
    
    <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/bbb" />
        <property name="username" value="bbbbbbb" />
        <property name="password" value="bbbbbbb" />
    </bean>
    
    <!--Configurações do segundo PU fim-->
     
    <!-- View scope -->
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="view">
                    <bean class="util.ViewScope" />
                </entry>
            </map>
        </property>
    </bean>      

</beans>
e no metodo para 'persistir' acrescentei o '("tm")' :
@Transactional("tm")
    public void create(T entity) {
        getEntityManager().persist(entity);
    }
Criado 16 de agosto de 2010
Ultima resposta 5 de jul. de 2011
Respostas 9
Participantes 5