Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] EclipseLink+Spring+ComboPooledDataSource+MySQL ORM not persisting

Well I would like to share my spring configuration with you & I hope it helps
you. Being hibernate user for many year moving to eclipselink pretty quickly
& happy with my decision :-)

db-data-source-context.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:util="http://www.springframework.org/schema/util";
	xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd";>
	
	<bean id="baseDataSource" class="org.apache.commons.dbcp.BasicDataSource"
		scope="prototype" lazy-init="false">
		<property name="driverClassName" value="${base.oracle.db.driverClassName}"
/>
		<property name="url" value="${base.oracle.db.url}" />
		<property name="username" value="${base.oracle.db.userName}" />
		<property name="password" value="${base.oracle.db.passWord}" />
		<property name="initialSize" value="${base.oracle.db.poolsize}" />
	</bean>
	
	<!--
	  Use PropertyPlaceholderConfigurer to get DB connection parameters from
database.properties file.
	  DB properties files differ per environment. Maven is responsible for
copying the correct properties file to database.properties.
	-->
	<bean
	
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location"
value="classpath:META-INF/spring/database.properties" />
		<property name="ignoreUnresolvablePlaceholders" value="false" />
		<property name="order" value="0" />
	</bean>
	
</beans>

db.properties
==========
base.oracle.db.url=jdbc:oracle:thin:@localhost:1521:XE
base.oracle.db.userName=base_owner
base.oracle.db.passWord=base_owner
base.oracle.db.driverClassName=oracle.jdbc.pool.OracleDataSource
base.oracle.db.poolsize=10

ormspring.xml
===========

<?xml version="1.0" encoding="UTF-8" ?>
<beans default-lazy-init="false" default-autowire="no"
	default-dependency-check="none"
xmlns="http://www.springframework.org/schema/beans";
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns:lang="http://www.springframework.org/schema/lang";
	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-2.5.xsd
	    				http://www.springframework.org/schema/aop 
	    				http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
						http://www.springframework.org/schema/lang 
						http://www.springframework.org/schema/lang/spring-lang-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";>
	<import resource="classpath:META-INF/spring/db-data-source-context.xml" />
	<context:load-time-weaver />
	<context:annotation-config />
	<tx:annotation-driven transaction-manager="transactionManager"
		order="600" />
	<!-- One CRUD service -->
	<bean id="crudService"
		class="com.oracle.healthinsurance.model.service.CrudServiceImpl">
		<property name="genericDao" ref="genericDao" />
	</bean>

	<!-- One DAO -->
	<bean id="genericDao"
class="com.oracle.healthinsurance.model.dao.GenericDAOJPAImpl">
		<property name="entityManagerFactory">
			<ref local="entityManagerFactory" />
		</property>
	</bean>
	
	<!-- One search service -->
	<bean id="searchService"
class="com.oracle.healthinsurance.model.service.GenericSearch">
		<property name="genericSearchDAO" ref="genericSearchDao" />
	</bean>

	<bean id="entityManagerFactory"
	
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="baseDataSource" />
		<property name="jpaVendorAdapter">
			<bean
				class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="generateDdl" value="false" />
				<property name="databasePlatform"
					value="org.eclipse.persistence.platform.database.oracle.OraclePlatform"
/>
			</bean>
		</property>
		<property name="loadTimeWeaver">
			<bean
			
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"
/>
		</property>
		<property name="jpaPropertyMap">
			<map>
				<entry>
					<key>
						<value>ohiNextThreadLocal</value>
					</key>
					<ref bean="ohiNextMap" />
				</entry>
				<entry>
					<key>
						<value>eclipselink.jdbc.native-sql</value>
					</key>
					<value>true</value>
				</entry>
			</map>
		</property>
	</bean>
</beans>

babasholaking wrote:
> 
> <p>Help anybody as I have waisted over a week with this problem. Currently
> considering going to Hibernate or DataNucleus(JPOX) instead of
> EclipseLink.</p>
> 
> <p>My issue is that getJpaTemplate().persist(entity) is not persisting to
> database! Looking at the logs I can see that no Insert statement issued by
> Eclipselink. Reviewing some of the forums (here and eclipselink), seems to
> suggest transaction related issue but I can't seem to be able resolve
> this. I have removed a few characters to make the code display properly,
> like '<' signs, here and there!
> </p>
> 
> <p>The following is my set-up;<br>
> 
> <p>datasourceContext.xml</p>
> 
> <pre><emp>
> <code>
> bean id="dataSource" parent="c3poAbstractDS"
>          p:driverClass="${db.driverClassName}" p:jdbcUrl="${db.url}"
>          p:user="${db.username}" p:password="${db.password}"
> lazy-init="false" 
> 
> bean id="c3poAbstractDS" class="com.mchange.v2.c3p0.ComboPooledDataSource"
>          destroy-method="close" abstract="true"
> p:initialPoolSize="${db.initialPoolSize}"
>          p:minPoolSize="${db.minPoolSize}"
> p:maxPoolSize="${db.maxPoolSize}"
>          p:acquireIncrement="2" p:acquireRetryAttempts="30"
>          p:acquireRetryDelay="100" p:checkoutTimeout="3000"
>          p:maxIdleTime ="1000" p:maxIdleTimeExcessConnections="300"
>          p:maxStatements="500" p:maxStatementsPerConnection ="300"
>          p:maxConnectionAge="3000"
>          p:idleConnectionTestPeriod="30" p:testConnectionOnCheckin="true"
>          p:testConnectionOnCheckout="false"
>          p:numHelperThreads="5" p:breakAfterAcquireFailure="false"
>          p:autoCommitOnClose="false"
>          p:forceIgnoreUnresolvedTransactions="true"
>          p:usesTraditionalReflectiveProxies="false"
>          p:preferredTestQuery="select 1;" 
> </code>
> </emp>
> </pre>
> 
> <p>applicationContext.xml entries:</p>
> <pre><emp>
> <code>
>    context:component-scan base-package="com.xxx.leopersistence" 
> 
>    context:annotation-config />
>    aop:aspectj-autoproxy />
> 
>    !-- Configure LoadTimeWeaver. Be sure to start JVM with
> -javaagent=spring-agent.jar -->
>    context:load-time-weaver aspectj-weaving="on" />
> 
>    !-- JPA annotations bean post processor. Will inject persistence
> related resources. -->
>    !-- Necessary to get the entity manager injected into the factory bean
> -->
>    bean
> class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"
> />
>    !-- Adds transparent exception translation to the DAOs -->
>    bean
> class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"
> />
>    !-- Adds dependency checks for setters annotated with @Required -->
>    bean
> class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"
> />
> 
>    bean id="jpaDialect"
>          class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect"
> />
>    bean id="loadTimeWeaver"
>         
> class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"
> />
>    bean id="jpaVendorAdapter"
>         
> class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"
>         
> p:databasePlatform="org.eclipse.persistence.platform.database.MySQLPlatform"
>          p:generateDdl="false" p:showSql="true" />
> 
>    bean id="entityManagerFactory"
>         
> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
>          p:persistenceUnitName="leopersistencePU"
> p:dataSource-ref="dataSource"
>          p:persistenceXmlLocation="classpath:META-INF/persistence.xml"
>          p:jpaDialect-ref="jpaDialect"
> p:jpaVendorAdapter-ref="jpaVendorAdapter"
>          p:loadTimeWeaver-ref="loadTimeWeaver" />
> 
>    bean id="transactionManager"
> class="org.springframework.orm.jpa.JpaTransactionManager"
>          p:entityManagerFactory-ref="entityManagerFactory" />
>    tx:annotation-driven transaction-manager="transactionManager" />
> 
>    bean id="DBAuthorizedPositionDAO"
> class="com.leofund.leopersistence.DBAuthorizedPositionDAO"
>          p:entityManagerFactory-ref="entityManagerFactory" />
>    ...
> </code>
> </emp></pre>
> 
> <p>persistence.xml entry;</p>
> <pre><emp><code>
>    persistence-unit name="leopersistencePU"
> transaction-type="RESOURCE_LOCAL">
>       provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
>      
> class>com.leofund.leopersistence.entities.DBAuthorizedPosition</class>
>        ...
>       exclude-unlisted-classes>false</exclude-unlisted-classes>
> 
>       properties>
>          property name="eclipselink.weaving" value="false" />
>          property name="eclipselink.logging.level" value="FINEST"/>
>          property name="eclipselink.target-database" value="MYSQL"/>
>          property name="eclipselink.target-server" value="None"/>
>          property name="show-sql" value="true"/>
> 
>          property name="eclipselink.cache.shared.default" value="false"/>
> 
>          property name="eclipselink.jdbc.read-connections.min" value="1"/>
>          property name="eclipselink.jdbc.write-connections.min"
> value="1"/>
> !--
>          property name="eclipselink.logging.logger"
>                   
> value="com.leofund.leoserver.utils.Log4JEclipseLinkLogger"/>
> 
>          property name="eclipselink.cache.type.default" value="SoftWeak"/>
>          property name="eclipselink.cache.size.default" value="0"/>
>  -->
>          property name="eclipselink.logging.thread" value="true"/>
>          property name="eclipselink.logging.session" value="true"/>
>          property name="eclipselink.logging.timestamp" value="true"/>
>          property name="eclipselink.logging.exceptions" value="true"/>
>          property name="eclipselink.logging.level.WEAVER" value="INFO"/>
> 
>          property name="eclipselink.orm.throw.exceptions" value="true"/>
> 
>          property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
>          property name="eclipselink.jdbc.batch-writing.size"
> value="1000"/>
>          property name="eclipselink.jdbc.bind-parameters" value="true"/>
> 
>          property name="eclipselink.jdbc.cache-statements" value="true"/>
>          property name="eclipselink.jdbc.cache-statements.size"
> value="10000"/>
> 
>          property name="eclipselink.persistence-context.close-on-commit"
> value="true"/>
>       /properties>
>    /persistence-unit>
> </code>
> </emp>
> </pre>
> 
> <p>I have tried various combination and have scowled google to no resolve.
> All my finders works fine but the insert/update/delete does not issue the
> relevant SQL. Please help I am desperate as it's now eating into my
> estimates big time. I have also reviewed my ID generation and tried the
> various options TABLE/SEQUENCE/IDENTITY, the same result.</p>
> 
> <p>All my entity managers are not defined with any Transactions e.g;</p>
> 
> <pre><code>
> public class DBEntityDAO extends JpaDaoSupport implements IDBEntityDAO {
> 
>    public void save(DBEntity entity) {
>       logger.info("saving DBEntity instance");
>       try {
>          getJpaTemplate().persist(entity);
>          logger.info("save successful");
>       } catch (RuntimeException re) {
>          logger.error("save failed", re);
>          throw re;
>       }
>    }
> 
>    public void delete(DBEntity entity) {
>       logger.info("deleting DBEntity instance");
>       try {
>          entity = getJpaTemplate().getReference(DBEntity.class,
>                entity.getEntityId());
>          getJpaTemplate().remove(entity);
>          logger.info("delete successful");
>       } catch (RuntimeException re) {
>          logger.error("delete failed", re);
>          throw re;
>       }
>    }
> 
>    public DBEntity update(DBEntity entity) {
>       logger.info("updating DBEntity instance");
>       try {
>          DBEntity result = getJpaTemplate().merge(entity);
>          logger.info("update successful");
>          return result;
>       } catch (RuntimeException re) {
>          logger.error("update failed", re);
>          throw re;
>       }
>    }
> 
>    public DBEntity findById(Integer id) {
>       logger.info("finding DBEntity instance with id: " + id);
>       try {
>          DBEntity instance = getJpaTemplate().find(DBEntity.class, id);
>          return instance;
>       } catch (RuntimeException re) {
>          logger.error("find failed", re);
>          throw re;
>       }
>    }
> </code></pre>
> 
> <p>I am using programmatic transactions at my service layer as
> follows;</p>
> 
> <pre><code>
>    public int addJPAManager(String name, String shortName, boolean active,
> int displayOrderId)
>       throws ServiceException {
>       int newManagerId = -1, managerId = -1;
>       TransactionStatus status = startDBTransaction();
>       try {
>          // find the entity represent the manager by name
>          List dbEntities =
> jpaDelegateServices.findByProperty(DBEntity.class, "name", name);
>          DBEntity dbEntity = null;
>          if (dbEntities == null || dbEntities.size() == 0) {
>             // none exists then create new
>             dbEntity = new DBEntity(name, shortName,
> SimpleUtils.booleanString(active));
>             jpaDelegateServices.save(DBEntity.class, dbEntity);
>          } else {
>             if (dbEntities.size() > 1)
>                throw new ServiceException("Error, non unique entity exists
> for the new manager!");
>             dbEntity = (DBEntity)dbEntities.get(0);
>          }
>          managerId = dbEntity.getEntityId();
> 
>          // find the manager by managerId
>          DBManager dbManager =
> (DBManager)jpaDelegateServices.findById(DBManager.class, managerId);
>          if (dbManager != null)
>             throw new ServiceException("Error, new manager already
> exists!");
> 
>          dbManager = new DBManager(managerId, dbEntity,
> (short)displayOrderId, booleanString(active));
>          jpaDelegateServices.save(DBManager.class, dbManager);
>          newManagerId = dbManager.getManagerId();
> 
>          transactionManager.commit(status);
>          messagingServices.broadcastDataElementChanged("Manager",
> newManagerId);
>       } finally {
>          if (!status.isCompleted()) transactionManager.rollback(status);
>       }
>       return newManagerId;
>    }
> 
>    private TransactionStatus startDBTransaction() {
>       DefaultTransactionDefinition def = new
> DefaultTransactionDefinition();
>      
> def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
>       return transactionManager.getTransaction(def);
>    }
> </code>
> </pre>
> 

-- 
View this message in context: http://www.nabble.com/EclipseLink%2BSpring%2BComboPooledDataSource%2BMySQL-ORM-not-persisting-tp23278418p23321614.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top