Compound custom id in bidirectional many-to-one
-----------------------------------------------
Key: OPENJPA-872
URL: https://issues.apache.org/jira/browse/OPENJPA-872
Project: OpenJPA
Issue Type: Bug
Affects Versions: 1.2.0
Reporter: David Blevins
Priority: Blocker
It seems that the order of parameters filled into the SQLBuffer are getting
mixed. Seeing this with a bidirectional many-to-one where the owning side uses
a compound primary key resulting in a compound foreign key. When the owning
side's collection is loaded the sql is correctly generated with the foreign
keys in the where clause but the values are not passed in the correct order.
There is clearly great care taken in regards to order when the sql string
SQLBuffer is getting filled in, but there seems to be a second pass where the
parameter values are collected and the order in this case *appears* to be
alphabetical. I.e. the two values in the compound key are "id" and
"brandname", if "brandname" is renamed to "zbrandname" the test will
consistently pass.
Caused by: <openjpa-1.2.0-r422266:683325 nonfatal store error>
org.apache.openjpa.util.StoreException: Wrong data type:
java.lang.NumberFormatException: For input string: "Red"
at
org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4238)
at
org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4203)
at
org.apache.openjpa.jdbc.sql.HSQLDictionary.newStoreException(HSQLDictionary.java:292)
at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:102)
at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:88)
at
org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:64)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:632)
at
org.apache.openjpa.kernel.DelegatingStoreManager.load(DelegatingStoreManager.java:116)
at
org.apache.openjpa.kernel.ROPStoreManager.load(ROPStoreManager.java:78)
at
org.apache.openjpa.kernel.StateManagerImpl.loadFields(StateManagerImpl.java:2920)
at
org.apache.openjpa.kernel.StateManagerImpl.loadField(StateManagerImpl.java:2998)
at
org.apache.openjpa.kernel.StateManagerImpl.fetchObjectField(StateManagerImpl.java:2241)
at
org.apache.openjpa.kernel.StateManagerImpl.fetchField(StateManagerImpl.java:777)
at
org.apache.openjpa.kernel.StateManagerImpl.fetch(StateManagerImpl.java:739)
at
org.apache.openjpa.enhance.RedefinitionHelper$1.invoke(RedefinitionHelper.java:230)
at $Proxy20.size(Unknown Source)
at org.superbiz.customid.TestBean.tx2(TestBean.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:158)
at
org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:141)
at
org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:122)
at
org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:211)
at
org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:169)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:217)
at
org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:77)
at
org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:286)
... 25 more
Caused by: java.sql.SQLException: Wrong data type:
java.lang.NumberFormatException: For input string: "Red"
at org.hsqldb.jdbc.Util.throwError(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.setParameter(Unknown Source)
at org.hsqldb.jdbc.jdbcPreparedStatement.setString(Unknown Source)
at
org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:132)
at
org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:132)
at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:309)
at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingPreparedStatement.setString(LoggingConnectionDecorator.java:990)
at
org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:309)
at
org.apache.openjpa.jdbc.sql.DBDictionary.setString(DBDictionary.java:1097)
at
org.apache.openjpa.jdbc.sql.DBDictionary.setUnknown(DBDictionary.java:1298)
at
org.apache.openjpa.jdbc.sql.SQLBuffer.setParameters(SQLBuffer.java:630)
at
org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:529)
at
org.apache.openjpa.jdbc.sql.SQLBuffer.prepareStatement(SQLBuffer.java:485)
at
org.apache.openjpa.jdbc.sql.SelectImpl.prepareStatement(SelectImpl.java:463)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:379)
at org.apache.openjpa.jdbc.sql.SelectImpl.execute(SelectImpl.java:339)
at
org.apache.openjpa.jdbc.sql.LogicalUnion$UnionSelect.execute(LogicalUnion.java:420)
at
org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:230)
at
org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:220)
at
org.apache.openjpa.jdbc.meta.strats.StoreCollectionFieldStrategy.load(StoreCollectionFieldStrategy.java:599)
at org.apache.openjpa.jdbc.meta.FieldMapping.load(FieldMapping.java:819)
at
org.apache.openjpa.jdbc.kernel.JDBCStoreManager.load(JDBCStoreManager.java:626)
... 47 more
Here's a snapshot of the SelectImp instance just after it is built:
• this = {org.apache.openjpa.jdbc.sql.selecti...@8556}"SELECT t0.ID,
t0.QUANTITY FROM LINEITEM t0 WHERE t0.FK_FOR_ID = ? AND t0.FK_FOR_BRANDNAME = ?"
• mapping =
{org.apache.openjpa.jdbc.meta.classmapp...@8381}"org.superbiz.customid.Invoice"
• toCols = {org.apache.openjpa.jdbc.schema.column...@8382}
• [0] =
{org.apache.openjpa.jdbc.schema.dynamicschemafactory$dynamiccol...@8409}"BRANDNAME"
• [1] =
{org.apache.openjpa.jdbc.schema.dynamicschemafactory$dynamiccol...@8425}"ID"
• fromCols = {org.apache.openjpa.jdbc.schema.column...@8382}
• [0] =
{org.apache.openjpa.jdbc.schema.dynamicschemafactory$dynamiccol...@8409}"BRANDNAME"
• [1] =
{org.apache.openjpa.jdbc.schema.dynamicschemafactory$dynamiccol...@8425}"ID"
• oid =
{org.apache.openjpa.util.objec...@8383}"org.superbiz.customid.invoice-org.superbiz.customid.invoice...@c412bd2"
• store = {org.apache.openjpa.jdbc.kernel.jdbcstoremana...@8373}
• pj = null
• buf = null
• parmList = {java.util.arrayl...@8720} size = 0
• collectParmValueOnly = true
• pks = {java.lang.object...@8790}
• [0] = {java.lang.str...@8413}"Red"
• [1] = {java.lang.inte...@8429}"1"
• toCols.length = 2
Note the primary key values are in the incorrect order for the way the sql
statement was built. Later when setParameters is called:
• this = {org.apache.openjpa.jdbc.sql.sqlbuf...@7747}
• ps =
{org.apache.openjpa.jdbc.kernel.jdbcstoremanager$cancelpreparedstatem...@7752}"prepstmnt
7374346 SELECT t0.ID, t0.QUANTITY FROM LINEITEM t0 WHERE t0.FK_FOR_ID = ? AND
t0.FK_FOR_BRANDNAME = ?"
• cacheParams = {java.util.arrayl...@7753} size = 2
• [0] = {java.lang.str...@7648}"Red"
• [1] = {java.lang.inte...@7652}"1"
• _params = {java.util.arrayl...@7754} size = 2
• [0] = {java.lang.inte...@7652}"1"
• [1] = {java.lang.str...@7648}"Red"
The interesting thing is that the value of _params is correct and matches the
sql. For some reason there
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.