Issue Details (XML | Word | Printable)

Key: OPENJPA-315
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Critical Critical
Assignee: Unassigned
Reporter: Dain Sundstrom
Votes: 0
Watchers: 1
Operations

If you were logged in you would be able to see more operations.
OpenJPA

Unenhanced generated id field of a primitive wrapper type causes NPE

Created: 14/Aug/07 07:04 PM   Updated: 13/May/09 10:06 PM
Return to search
Component/s: UnenhancedClasses
Affects Version/s: None
Fix Version/s: 1.0.0

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Licensed for inclusion in ASF works OPENJPA-315.patch 2007-08-14 07:07 PM Dain Sundstrom 10 kB
Issue Links:
Blocker
 

Resolution Date: 29/Aug/07 01:26 AM


 Description  « Hide
Unenhanced generated id field of a primitive wrapper type causes NPE because the field value is null. This bug only occurs when the id field is an object type as primitive fields are automatically initialized to 0. I believe this is a critical bug because when using a primitive field the system appears to work but the id field is always 0 which could cause data corruption. The following stack trace shows the bug:

<openjpa-0.0.0-r420667:564688M nonfatal general error> org.apache.openjpa.persistence.PersistenceException: null
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2437)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2251)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1010)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:541)
at org.apache.openjpa.enhance.AbstractUnenhancedClassTest.getObjectIdHelper(AbstractUnenhancedClassTest.java:134)
at org.apache.openjpa.enhance.AbstractUnenhancedClassTest.testGetObjectIdOnOpenJPAType(AbstractUnenhancedClassTest.java:115)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)
Caused by: java.lang.NullPointerException
at org.apache.openjpa.util.ApplicationIds.fromPKValues(ApplicationIds.java:152)
at org.apache.openjpa.enhance.ReflectingPersistenceCapable.pcNewObjectIdInstance(ReflectingPersistenceCapable.java:257)
at org.apache.openjpa.util.ApplicationIds.create(ApplicationIds.java:384)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2405)
... 23 more

The attached patch reproduces this bug. The patch is a clone of TestUnenhancedFieldAccess that simply changes the id field to type Integer.


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Dain Sundstrom added a comment - 14/Aug/07 07:07 PM
This patch has overrides for all the failing tests that do nothing. These empty overrides must be removed to reproduce the bug.

Dain Sundstrom made changes - 14/Aug/07 07:07 PM
Field Original Value New Value
Attachment OPENJPA-315.patch [ 12363796 ]
Dain Sundstrom made changes - 14/Aug/07 10:59 PM
Link This issue blocks OPENEJB-628 [ OPENEJB-628 ]
Patrick Linskey added a comment - 20/Aug/07 11:14 PM
> I believe this is a critical bug because when using a primitive
> field the system appears to work but the id field is always 0
> which could cause data corruption.

I don't follow -- are you saying that you are seeing a data corruption problem?

Note that OpenJPA will not assign an ID field until it needs to, so you should call flush() or em.getObjectId() before checking to see if an ID field has been provided.

Repository Revision Date User Message
ASF #567875 Mon Aug 20 23:19:05 UTC 2007 pcl OPENJPA-314, OPENJPA-315
Files Changed
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/UnenhancedCompoundPKFieldAccessSuperclass.java
MODIFY /openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/UnenhancedFieldAccessPrimitiveWrapperSubclass.java
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/UnenhancedCompoundPKFieldAccessSubclass.java
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/TestUnenhancedCompoundPKSubclass.java
MODIFY /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/TestUnenhancedFieldAccess.java
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/UnenhancedFieldAccessPrimitiveWrapper.java
MODIFY /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/TestUnenhancedPropertyAccess.java
ADD /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/TestUnenhancedFieldAccessPrimitiveWrapper.java
MODIFY /openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/util/ApplicationIds.java
MODIFY /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/enhance/AbstractUnenhancedClassTest.java

Patrick Linskey added a comment - 20/Aug/07 11:20 PM
Marking as resolved under the assumption that the IDs are properly assigned as tested elsewhere.

Patrick Linskey made changes - 20/Aug/07 11:20 PM
Resolution Fixed [ 1 ]
Status Open [ 1 ] Resolved [ 5 ]
Dain Sundstrom added a comment - 28/Aug/07 03:32 PM
> I don't follow -- are you saying that you are seeing a data corruption problem?

No. I said "could cause data corruption". Any improperly loaded field in a bean could cause data corruption simply because the data isn't 100% normalized. For example, someone could make a calculation using the primary key, which was improperly set to 0, and then store that calculation in another bean.

> Note that OpenJPA will not assign an ID field until it needs to, so you should call flush() or em.getObjectId() before checking to > see if an ID field has been provided.

Please review and apply this test. You may have already fixed the bug when fixing the other issues I committed, but I believe this is the only test for this specific issue. If you have already added another test for this bug, that is fine also but should be noted in this bug report for completeness.

Dain Sundstrom made changes - 28/Aug/07 03:32 PM
Resolution Fixed [ 1 ]
Status Resolved [ 5 ] Reopened [ 4 ]
Patrick Linskey added a comment - 28/Aug/07 05:26 PM
> Please review and apply this test.

What is "this test"? Are you referring to the patch associated with this issue? If so, how do the changes in http://svn.apache.org/viewcvs?view=rev&rev=567875 not resolve this issue? Note that if you hit the 'subversion commits' tab (or the 'all' tab) in the comments section, you'll see all commits associated with a particular JIRA issue.

Also, from a process standpoint, it's fine to create test case patches that will cause the build to fail when they are applied; presumably, the person who grabs the patch and applies it expects to use the test case to validate that a fix works.

Dain Sundstrom added a comment - 29/Aug/07 01:26 AM
Sorry. I was responding to your comment "Marking as resolved under the assumption that the IDs are properly assigned as tested elsewhere", which to me implied that you assumed there was already a test for this bug so my patch wasn't necessary. Again, sorry.

Dain Sundstrom added a comment - 29/Aug/07 01:26 AM
Issue has been resolved and a test has been added

Dain Sundstrom made changes - 29/Aug/07 01:26 AM
Resolution Fixed [ 1 ]
Status Reopened [ 4 ] Resolved [ 5 ]
Michael Dick made changes - 13/May/09 10:06 PM
Component/s UnenhancedClasses [ 12312835 ]