Java Mailing List Archive

http://www.gg3721.com/

Home » users.openjpa »

A problem using openjpa 1.0.0 -- em.merge(obj) generate insert into sql
statment while enhancement at runtime

Hong Jin Lu

2008-05-13


Author LoginPost Reply

Hi, forks:
I was encountered a situation. And I am not sure whether it come out of my dev environment or my code:

My Environment:
Windows XP, DB2, JDK5, OpenJPA 1.0.0

Code Scenario:
CaseType has a "many to many" relationship with CaseItemType
TestCase is using CaseType's DAO class

Code:
orm.xml
<entity name="CaseType" class="CaseType">
<table name="CASETYPE"></table>
<named-query name="findCaseTypeByBusID">
<query>SELECT caseType FROM CaseType caseType where caseType.typeCode = ?1</query>
</named-query>
<attributes>
<id name="typeCode">
<column name="CASETYPECODE" column-definition="VARCHAR(20)" />
</id>
<basic name="description">
<column name="DESCRIPTION"
column-definition="VARCHAR(20)" />
</basic>
<many-to-many name="caseItemTypes" target-entity="CaseItemType" fetch="LAZY">
<join-table name="CASETYPE_CASEITEMTYPE">
<join-column name="CASETYPECODE" referenced-column-name="CASETYPECODE"/>
<inverse-join-column name="CASEITEMTYPECODE" referenced-column-name="CASEITEMTYPECODE"/>
</join-table>
<cascade>
<cascade-merge />
</cascade>
</many-to-many>
</attributes>
</entity>

<entity name="CaseItemType" class="CaseItemType">
<table name="CASEITEMTYPE"></table>
<named-query name="findCaseItemTypeByBusID">
<query>SELECT caseItemType FROM CaseItemType caseItemType where caseItemType.typeCode = ?1</query>
</named-query>
<attributes>
<id name="typeCode">
<column name="CASEITEMTYPECODE" column-definition="VARCHAR(20)" />
</id>
<basic name="description">
<column name="DESCRIPTION"
column-definition="VARCHAR(20)" />
</basic>
</attributes>
</entity>

DAO java class :

public String createCaseType(CaseType caseType) {
if(log.isDebugEnabled()) {
log.debug("entering createCaseType method in AbstractCaseTypeDAO class");
}
EntityManager em = emf.createEntityManager();
EntityTransaction trans = em.getTransaction();
trans.begin();
if(caseType.getCaseItemTypes() != null) {
Iterator iter = caseType.getCaseItemTypes().iterator();
while(iter.hasNext()) {
CaseItemType caseItemType = (CaseItemType)iter.next();
em.persist(caseItemType);
}
}
em.persist(caseType);
trans.commit();
em.close();
if(log.isDebugEnabled()) {
log.debug("exiting createCaseType method in AbstractCaseTypeDAO class");
}
return caseType.getTypeCode();
}

public CaseType updateCaseType(CaseType caseType) {
if(log.isDebugEnabled()) {
log.debug("entering updateCaseType method in AbstractCaseTypeDAO class");
}
EntityManager em = emf.createEntityManager();
EntityTransaction trans = em.getTransaction();
trans.begin();
em.merge(caseType);
trans.commit();
em.close();
if(log.isDebugEnabled()) {
log.debug("exiting updateCaseType method in AbstractCaseTypeDAO class");
}
return caseType;
}

Test Case:

JPADAOFactory daoFactory = null;
CaseTypeDAO caseTypeDAO = null;

protected void setUp() throws Exception {
daoFactory = JPADAOFactory.getInstance();
caseTypeDAO = (CaseTypeDAO)daoFactory.getDAO("CaseTypeDAO");
}

protected void tearDown() throws Exception {
daoFactory = null;
caseTypeDAO = null;
}


public void testCreateCaseType() {
CaseType caseType = new CaseType();
caseType.setTypeCode("CtypeCode001");
caseType.setDescription("Cdescription001");

CaseItemType caseItemType = new CaseItemType();
caseItemType.setTypeCode("CItypeCode001");
caseItemType.setDescription("CIdescription001");
caseType.getCaseItemTypes().add(caseItemType);
String returnID = caseTypeDAO.createCaseType(caseType);
Assert.assertEquals("CtypeCode001", returnID);
}

public void testUpdateCaseType() {
CaseType caseType = new CaseType();
caseType.setTypeCode("CtypeCode001");
caseType.setDescription("Cdescription001U");

caseType = caseTypeDAO.updateCaseType(caseType);

Assert.assertEquals("CtypeCode001", caseType.getTypeCode());
}

public void testUpdateCaseTypeWithRef() {
CaseType caseType = new CaseType();
caseType.setTypeCode("CtypeCode001");
caseType.setDescription("Cdescription001U");

CaseItemType caseItemType = new CaseItemType();
caseItemType.setTypeCode("CItypeCode001");
caseItemType.setDescription("CIdescription001U");
caseType.getCaseItemTypes().add(caseItemType);

caseType = caseTypeDAO.updateCaseType(caseType);

Assert.assertEquals("CtypeCode001", caseType.getTypeCode());
}

Symptom (testCreateCaseType method could create data in DB2, testUpdateCaseType method is not right):
when I run it with jvm argument: -javaagent:"D:/IBM/Share Library/JPA/apache-openjpa-1.0.0/openjpa-1.0.0.jar"
then exception I've got :
(See attached file: exception.txt)
However, if I remove jvm argument mentioned above, then the code could work.

So Enhancement might result different SQL statement


Attachment:

(See attached file: code.zip)

Appreciate your help!
Hongjin Lu (鲁红金)
Developer, GCG Global Business Solution Centre (GBSC) - GBS Asset Management@CDL
Tel: +86 10 82454718, TieLine: 9152244 x 4718, Fax: +86-10-8245-2904
E-mail: luhongj@cn.ibm.com
Address: 3/F DeShi Building, No. 9 ShangDi Dong Lu (East Road) Haidian District Beijing, 100094 P.R. China

1735 derby.ojpa TRACE [main] openjpa.jdbc.SQL - <t 1096171862, conn 880424058> executing prepstmnt 1380602442
INSERT INTO CASETYPE (CASETYPECODE, DESCRIPTION)
  VALUES (?, ?)
[params=(String) CtypeCode001, (String) Cdescription001U]
1735 derby.ojpa TRACE [main] openjpa.jdbc.SQL - <t 1096171862, conn 880424058> [0 ms] spent
<openjpa-1.0.0-r420667:568756 fatal store error> org.apache.openjpa.persistence.RollbackException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred.
 at org.apache.openjpa.persistence.EntityManagerImpl.commit (EntityManagerImpl.java:419)
 at com.ibm.sbs.cci.dao.AbstractCaseTypeDAO.updateCaseType(AbstractCaseTypeDAO.java:55)
 at com.ibm.sbs.cci.test.CaseTypeDAOTestCase.testUpdateCaseType(CaseTypeDAOTestCase.java:53)
 at com.ibm.sbs.cci.test.CaseTypeDAOTestCase.main(CaseTypeDAOTestCase.java:62)
Caused by: <openjpa-1.0.0-r420667:568756 fatal general error> org.apache.openjpa.persistence.PersistenceException: The transaction has been rolled back. See the nested exceptions for details on the errors that occurred.
 at org.apache.openjpa.kernel.BrokerImpl.newFlushException (BrokerImpl.java:2099)
 at org.apache.openjpa.kernel.BrokerImpl.flush (BrokerImpl.java:1946)
 at org.apache.openjpa.kernel.BrokerImpl.flushSafe (BrokerImpl.java:1844)
 at org.apache.openjpa.kernel.BrokerImpl.beforeCompletion (BrokerImpl.java:1762)
 at org.apache.openjpa.kernel.LocalManagedRuntime.commit (LocalManagedRuntime.java:81)
 at org.apache.openjpa.kernel.BrokerImpl.commit (BrokerImpl.java:1292)
 at org.apache.openjpa.kernel.DelegatingBroker.commit (DelegatingBroker.java:861)
 at org.apache.openjpa.persistence.EntityManagerImpl.commit (EntityManagerImpl.java:408)
 ... 3 more
Caused by: <openjpa-1.0.0-r420667:568756 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;DB2ADMIN.CASETYPE {prepstmnt 1380602442
INSERT INTO CASETYPE (CASETYPECODE, DESCRIPTION)
  VALUES (?, ?)
[params=(String) CtypeCode001, (String) Cdescription001U]} [code=-803, state=23505]SQLCA OUTPUT[Errp=SQLDMISR, Errd=-2146893819, 5, 0, 0, -957, 0]
FailedObject: com.ibm.sbs.cci.CaseType@(protected)
 at org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException (DBDictionary.java:3849)
 at org.apache.openjpa.jdbc.sql.DB2Dictionary.newStoreException (DB2Dictionary.java:458)
 at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore (SQLExceptions.java:97)
 at org.apache.openjpa.jdbc.sql.SQLExceptions.getStore (SQLExceptions.java:67)
 at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal (PreparedStatementManagerImpl.java:108)
 at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush (PreparedStatementManagerImpl.java:73)
 at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush (ConstraintUpdateManager.java:543)
 at org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush (ConstraintUpdateManager.java:105)
 at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush (AbstractUpdateManager.java:89)
 at org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush (AbstractUpdateManager.java:72)
 at org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush (JDBCStoreManager.java:514)
 at org.apache.openjpa.kernel.DelegatingStoreManager.flush (DelegatingStoreManager.java:130)
 ... 10 more
Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: DB2 SQL error: SQLCODE: -803, SQLSTATE: 23505, SQLERRMC: 1;DB2ADMIN.CASETYPE {prepstmnt 1380602442
INSERT INTO CASETYPE (CASETYPECODE, DESCRIPTION)
  VALUES (?, ?)
[params=(String) CtypeCode001, (String) Cdescription001U]} [code=-803, state=23505]
 at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap (LoggingConnectionDecorator.java:192)
 at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$800(LoggingConnectionDecorator.java:57)
 at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.executeUpdate(LoggingConnectionDecorator.java:858)
 at org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeUpdate (DelegatingPreparedStatement.java:269)
 at org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeUpdate(JDBCStoreManager.java:1363)
 at org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal (PreparedStatementManagerImpl.java:97)
 ... 17 more

Attachment: cid:2__=C7BBFEDBDFBF58538f9e8a93df938@cn.ibm.com (zipped)
©2008 gg3721.com - Jax Systems, LLC, U.S.A.