Thanks so much for your quick response. I really appreciate it. I tried adding the em.flush after the em.persist and I am still getting the same behavior i.e. After the insert the dto.recId which is mapped to an non primary key IDENTITY column is not populated on the DTO although the REC_ID exists in the database.
I dont know of course but this would lead me to believe that at the lower level stmt.getGeneratedKeys is not getting called to populate "non primary key" IDENTITY Fields I will attempt to post more detailed information in the hopes that will help and not confuse the issue. The Entity/DTO called INPARTMASTER actually not PART <code> /** * The persistent class for the INPARTMASTER database table. * */ @Entity @Table(name="INPARTMASTER") public class Inpartmaster implements Serializable, Persistent<InpartmasterPK> { private static final long serialVersionUID = 1L; @EmbeddedId private InpartmasterPK pk; ... more columns here @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="REC_ID") private Integer recId; ... more columns here </code> InpartmasterPK <code> package com.ais.persistence.entities; import java.io.Serializable; import javax.persistence.Embeddable; @Embeddable public class InmasterPK implements Serializable { private String incomp; private String inindiv; private String inpart; private static final long serialVersionUID = 1L; public InmasterPK() { super(); } getters/setters etc..... } </code For The Data Access Object Code The DAO is Spring @Transactional Beans. The annotation for the DAO is @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = { Exception.class }) <code> public PK insert(DTO dto) throws Exception { EntityManager em = getEntityManager(); em.persist(dto); em.flush();//added to try and retrieve stmt.getGeneratedKeys return dto.getPk(); } </code> I have a Manager class which wraps the DAO. This manager is also transactional with this annotation @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = { Exception.class }) The Manager code at this point simply wraps the DAO code <code> public Inpartmaster insert(Inpartmaster inpartmaster) throws InventoryException { InpartmasterPK pk = null; try { //TODO: add Pre-submit validation process //Calling JPA InpartmasterDao pk = inpartmasterDao.insert(inpartmaster); } catch (Exception e) { log.error(Utility.getStackTrace(e)); log.error(e); throw new InventoryException(e); } return inpartmaster; } </code> The junit code looks like <code> public void testInsert() { try { log.info("insert"); log.info("part="+part); manager = getManager(); pk.setIncomp(comp); pk.setInpart(part); dto.setPk(pk); log.info(dto); dto.setChgdate(new Date()); manager.insert(dto); log.info("recId="+dto.getRecId()); assertFalse("recId is null after insert should not be", dto.getRecId() == null); //fails here the recId is not being populated with something like stmt.getGeneratedKeys } catch(Exception e) { log.error("-------------------"); log.error(Utility.getStackTrace(e)); fail(e.getMessage()); } } </code> The persistence.xml looks like <code> <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="airweb-JPA-J2-SNAPSHOT" transaction-type="RESOURCE_LOCAL"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <jta-data-source>jdbc/db2svr</jta-data-source> <class>com.ais.persistence.entities.InpartmasterPK</class> <class>com.ais.persistence.entities.Inpartmaster</class> ...more classes here <!-- Validation modes: AUTO, CALLBACK, NONE --> <validation-mode>NONE</validation-mode> <properties> <property name="openjpa.MaxFetchDepth" value="5"/> <property name="openjpa.jdbc.MappingDefaults" value="StoreEnumOrdinal=false"/> <property name="openjpa.RuntimeUnenhancedClasses" value="unsupported"/> <!-- these should be commented out as the mainDataSource is passed into the EnitityManagerFactory from spring <property name="openjpa.ConnectionUserName" value="XXXX"/> <property name="openjpa.ConnectionPassword" value="XXXXX"/> <property name="openjpa.ConnectionURL" value="jdbc:db2://db2svr:50001/cmsdb:driverType=4;currentSchema=CMSDB;defaultIsolationLevel=2;retrieveMessagesFromServerOnGetMessage=true;pdqProperties=executionMode(DYNAMIC),captureMode(off),allowDynamicSQL(true),pureQueryXml(C://RAD//PersistenceFrameworkUI//WebContent//META-INF//JPAUI.pdqxml);"/> <property name="openjpa.ConnectionDriverName" value="com.ibm.db2.jcc.DB2Driver"/> --> <property name="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.DB2Dictionary"/> <property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=TRACE, Tool=INFO, SQL=TRACE"/> <property name="openjpa.jdbc.Schema" value="CMSDB"/> </properties> </persistence-unit> </persistence> </code> The spring configuration is: <code> <bean id="mainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:jdbcUrl="jdbc:db2://db2svr:50001/cmsdb:driverType=4;currentSchema=CMSDB;defaultIsolationLevel=2;retrieveMessagesFromServerOnGetMessage=true;" p:driverClass="com.ibm.db2.jcc.DB2Driver" p:user="XXXXX" p:password="XXXXX" p:connectionCustomizerClassName="com.cms.db.CmsConnectionCustomizer" p:preferredTestQuery="/* ping */ select 1 from (values 1)" p:initialPoolSize="0" p:minPoolSize="0" p:maxPoolSize="50" p:acquireIncrement="1" p:maxStatements="0" p:numHelperThreads="3" p:testConnectionOnCheckin="true" p:testConnectionOnCheckout="true" p:maxConnectionAge="0" p:idleConnectionTestPeriod="25" p:maxIdleTime="60" p:acquireRetryAttempts="0" p:maxIdleTimeExcessConnections="600" /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="mainDataSource"/> <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> </property> <property name="jpaDialect" ref="jpaDialect"/> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> <property name="databasePlatform" value="org.apache.openjpa.jdbc.sql.DB2Dictionary" /> </bean> </property> </bean> <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.OpenJpaDialect"/> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> <context:component-scan base-package="com.ais.persistence.entities.dao" /> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <bean id="jpaInpartmasterDao" class="com.ais.persistence.entities.dao.InpartmasterDao" /> <bean id="jpaInventoryManager" class="com.cms.inv.InventoryManagerJPAImpl" p:inpartmasterDao-ref="jpaInpartmasterDao" /> </code> The Database version is DB2 Express C v 9.7.200.358 on a windows 7 box. I am using jdk version jdk1.6.0_07 inside of RAD 8.0.1 to run my junit tests. I will respond to Kevins post with the output of the trace log which I have turned on in my junit test. Thanks again so much for your help. -- View this message in context: http://openjpa.208410.n2.nabble.com/How-to-get-generated-keys-without-requerying-the-database-tp5957346p5959949.html Sent from the OpenJPA Users mailing list archive at Nabble.com.