Fala galera, blz ?
Então estou desenvolvendo uma app usando spring + jpa e estou com dificuldade de deixar uma persistence-unit para teste e outra para produção.
O que eu gostaria de fazer é usar as mesmas configurações do spring que uso em produção (Postgre) mas com o banco apontando para o banco de teste (HSQL) sem ter que duplicar o applicationContext.xml nem o persistence.xml pra ficar com os ambientes o mais parecido o possível.
O que eu tentei foi ter dois applicationContext.xml sendo que o de teste contém apenas a minha conexão para teste. Eu esperava que ele sobrescrevesse o bean mas vejo que ele ainda aponta para o banco de prod. Embora ele mostre uma mensagem dizendo que está sobrescrevendo o emf.
Alguém tem uma sugestão para resolver o problema ou uma outra abordagem para fazer os testes ?
Abaixo as configurações...
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/persistence"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="default">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" />
<property name="hibernate.c3p0.min_size" value="5" />
<property name="hibernate.c3p0.max_size" value="20" />
<property name="hibernate.c3p0.timeout" value="180" />
<property name="hibernate.c3p0.idle_test_period" value="100" />
<property name="hibernate.generate_statistics" value="true" />
</properties>
</persistence-unit>
</persistence>
applicationContext.xml (conexão com Postgre)
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config />
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="default" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="javax.persistence.jdbc.driver">${jdbc.driver}</prop>
<prop key="javax.persistence.jdbc.url">${jdbc.url}</prop>
<prop key="javax.persistence.jdbc.user">${jdbc.user}</prop>
<prop key="javax.persistence.jdbc.password">${jdbc.password}</prop>
</props>
</property>
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:property-placeholder location="classpath:jdbc.test.properties"/>
<bean id="emf" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="default" />
<property name="jpaProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="javax.persistence.jdbc.driver">${jdbc.driver}</prop>
<prop key="javax.persistence.jdbc.url">${jdbc.url}</prop>
<prop key="javax.persistence.jdbc.user">${jdbc.user}</prop>
<prop key="javax.persistence.jdbc.password">${jdbc.password}</prop>
</props>
</property>
</bean>
</beans>
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml","/applicationContext-test.xml"})
public class DAOTest {
....
}
No log ele me dá a mensagem de que está sobrescrevendo...
17:53:32,818 INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'emf': [color=red]replacing[/color] [Generic bean: class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [[color=red]applicationContext.xml[/color]]] with [Generic bean: class [org.springframework.orm.jpa.LocalEntityManagerFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in class path resource [[color=red]applicationContext-test.xml[/color]]]
Mas logo depois ele faz conexão com o banco de produção (Postgre) não de teste (HSQL)
17:53:33,896 INFO [C3P0ConnectionProvider] C3P0 using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost/bla
17:53:33,897 INFO [C3P0ConnectionProvider] Connection properties: {user=blauser, password=****, autocommit=true, release_mode=auto}
17:53:33,897 INFO [C3P0ConnectionProvider] autocommit mode: true
17:53:33,936 INFO [MLog] MLog clients using log4j logging.
17:53:34,204 INFO [C3P0Registry] Initializing c3p0-0.9.1 [built 16-January-2007 14:46:42; debug? true; trace: 10]
17:53:34,374 INFO [AbstractPoolBackedDataSource] Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@d5e9dc2c [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@8d755832 [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge0ys8a1760s6qe0t2z2|1e184cb, idleConnectionTestPeriod -> 100, initialPoolSize -> 5, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 180, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 5, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@49e5f173 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge0ys8a1760s6qe0t2z2|4ac216, jdbcUrl -> jdbc:postgresql://localhost/bla, properties -> {user=******, password=******, autocommit=true, release_mode=auto} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge0ys8a1760s6qe0t2z2|19a0203, numHelperThreads -> 3 ]
17:53:35,054 INFO [SettingsFactory] RDBMS: PostgreSQL, version: 8.4.4
17:53:35,054 INFO [SettingsFactory] JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 8.4 JDBC4 (build 701)
17:53:35,106 INFO [Dialect] Using dialect: org.hibernate.dialect.PostgreSQLDialect
O que eu posso estar fazendo errado ?
Abraços.