You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2011/03/22 18:41:59 UTC

svn commit: r1084265 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/ op...

Author: curtisr7
Date: Tue Mar 22 17:41:58 2011
New Revision: 1084265

URL: http://svn.apache.org/viewvc?rev=1084265&view=rev
Log:
OPENJPA-1944: Properly handle a null version field.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/AnnoTest1.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestVersion.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/version/TestVersionColumn.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java?rev=1084265&r1=1084264&r2=1084265&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ColumnVersionStrategy.java Tue Mar 22 17:41:58 2011
@@ -270,15 +270,6 @@ public abstract class ColumnVersionStrat
 
         Object version = populateFromResult(res);
         
-        // we know the version column was part of the result - safe to initialize to 1.
-        if(version == null) { 
-            if (sm.getMetaData().getVersionField().getDeclaredTypeCode() == JavaTypes.DATE) {
-                version = new Timestamp(1);
-            } else {
-                version = new Long(1);
-            }
-        }
-
         // OPENJPA-662 Allow a null StateManager because this method may just be
         // invoked to get the result of projection query
         if (sm != null) {

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java?rev=1084265&r1=1084264&r2=1084265&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java Tue Mar 22 17:41:58 2011
@@ -3069,7 +3069,10 @@ public class StateManagerImpl
             // always be set after the first state load or set (which is why
             // we do this even if no fields were loaded -- could be that this
             // method is being called after a field is set)
-            if (_loadVersion == null && (_meta == null || _meta.getVersionField() != null)) {
+            // If the _loadVersion field is null AND the version field has been loaded, skip calling sync version.
+            // This indicates that the DB has a null value for the version column. 
+            FieldMetaData versionMeta = _meta != null ? _meta.getVersionField() : null;
+            if (_loadVersion == null && (versionMeta != null && !_loaded.get(versionMeta.getIndex()))) {
                 syncVersion(sdata);
                 ret = ret || _loadVersion != null;
             }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/AnnoTest1.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/AnnoTest1.java?rev=1084265&r1=1084264&r2=1084265&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/AnnoTest1.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/AnnoTest1.java Tue Mar 22 17:41:58 2011
@@ -41,7 +41,7 @@ public class AnnoTest1 {
 
     @Version
     @Column(name = "ANNOVER")
-    protected int version;
+    protected Integer version;
 
     @Basic
     protected int basic;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestVersion.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestVersion.java?rev=1084265&r1=1084264&r2=1084265&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestVersion.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestVersion.java Tue Mar 22 17:41:58 2011
@@ -34,7 +34,10 @@ public class TestVersion extends SingleE
 
     public void setUp() {
         setUp(AnnoTest1.class, AnnoTest2.class, AnnoTest3.class, Flat1.class,
-            EmbedOwner.class, EmbedValue.class, CLEAR_TABLES);
+            EmbedOwner.class, EmbedValue.class, CLEAR_TABLES 
+            ,"openjpa.Log","SQL=trace"
+            ,"openjpa.ConnectionFactoryProperties","printParameters=true"
+        );
 
         EntityManager em = emf.createEntityManager();
         em.getTransaction().begin();
@@ -192,4 +195,37 @@ public class TestVersion extends SingleE
             cls.getVersion().getStrategy());
         assertEquals(1, cls.getVersion().getColumns().length);
     }
+
+    public void testNullInitialVersion() {
+        EntityManager em = emf.createEntityManager();
+        EntityManager em2 = emf.createEntityManager();
+        try {
+            AnnoTest1 e = new AnnoTest1(System.currentTimeMillis());
+            em.getTransaction().begin();
+            em.persist(e);
+            em.createQuery("UPDATE AnnoTest1 a SET a.version=null where a.pk=:pk").setParameter("pk", e.getPk())
+                .executeUpdate();
+            em.getTransaction().commit();
+            em.close();
+             em = emf.createEntityManager();
+            
+            em.getTransaction().begin();
+            em2.getTransaction().begin();
+            
+            AnnoTest1 e2 = em2.find(AnnoTest1.class, e.getPk());
+            e = em.find(AnnoTest1.class, e.getPk());
+            e.setBasic(1);
+            em.getTransaction().commit();
+            
+            e2 = em2.find(AnnoTest1.class, e.getPk());
+            em2.refresh(e2);
+            System.out.println(e2.getBasic());
+        } finally {
+            if (em.getTransaction().isActive()) {
+                em.getTransaction().rollback();
+            }
+            em.close();
+        }
+    }
+
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/version/TestVersionColumn.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/version/TestVersionColumn.java?rev=1084265&r1=1084264&r2=1084265&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/version/TestVersionColumn.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/version/TestVersionColumn.java Tue Mar 22 17:41:58 2011
@@ -53,7 +53,8 @@ public class TestVersionColumn extends S
         assertNotNull("No results found", results);
         assertFalse("No results found", results.isEmpty());
         for (IntVersion iv : results) {
-            assertEquals("Version should be initialized to 1, was: " + iv.getVersion(), 1, iv.getVersion());
+            assertEquals("Version should be initialized to 0, was: " + iv.getVersion(), 0, iv.getVersion());
+            em.find(IntVersion.class, iv.getId());
         }
 
         assertEquals("Unexpected number of SQL statements: " + getSQLCount(), 1, getSQLCount());
@@ -80,7 +81,8 @@ public class TestVersionColumn extends S
         assertNotNull("No results found", results);
         assertFalse("No results found", results.isEmpty());
         for (TimestampVersion iv : results) {
-            assertEquals("Version should be initialized to 1" + iv.getVersion(), new Timestamp(1), iv.getVersion());
+            assertEquals("Version should be initialized to null, was: " + iv.getVersion(), null, iv.getVersion());
+            em.find(TimestampVersion.class, iv.getId());
         }
 
         assertEquals("Unexpected number of SQL statements: " + getSQLCount(), 1, getSQLCount());
@@ -107,9 +109,11 @@ public class TestVersionColumn extends S
         assertNotNull("No results found", results);
         assertFalse("No results found", results.isEmpty());
         for (ShortVersion iv : results) {
-            assertEquals("Version should be initialized to 1" + iv.getVersion(), 1, iv.getVersion());
+            assertEquals("Version should be initialized to 0, was" + iv.getVersion(), 0, iv.getVersion());
+            em.find(ShortVersion.class, iv.getId());
         }
 
+
         assertEquals("Unexpected number of SQL statements: " + getSQLCount(), 1, getSQLCount());
 
         em.close();