You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2011/09/20 02:02:38 UTC

svn commit: r1172911 - in /openjpa/branches/1.2.x: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/

Author: hthomann
Date: Tue Sep 20 00:02:37 2011
New Revision: 1172911

URL: http://svn.apache.org/viewvc?rev=1172911&view=rev
Log:
OPENJPA-1226: Back ported Fay's changes to 1.2.x and created small test for 1.2.x since Fay's test won't run on 1.2.x (too many 2.0.x dependancies).

Added:
    openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java   (with props)
Modified:
    openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java
    openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java
    openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java
    openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbedded.java

Modified: openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java?rev=1172911&r1=1172910&r2=1172911&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java (original)
+++ openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/DetachedStateManager.java Tue Sep 20 00:02:37 2011
@@ -115,7 +115,7 @@ public class DetachedStateManager
 
         // pre-load for efficiency: current field values for restore, dependent
         // for delete
-        FieldMetaData[] fields = meta.getFields();
+        FieldMetaData[] fields = sm.getMetaData().getFields(); 
         int restore = broker.getRestoreState();
         if (_dirty.length() > 0) {
             BitSet load = new BitSet(fields.length);

Modified: openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java?rev=1172911&r1=1172910&r2=1172911&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java (original)
+++ openjpa/branches/1.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java Tue Sep 20 00:02:37 2011
@@ -146,7 +146,7 @@ class VersionAttachStrategy
         int detach = (isNew) ? DETACH_ALL : broker.getDetachState();
         FetchConfiguration fetch = broker.getFetchConfiguration();
         try {
-            FieldMetaData[] fmds = meta.getFields();
+            FieldMetaData[] fmds = sm.getMetaData().getFields(); 
             for (int i = 0; i < fmds.length; i++) {
                 switch (detach) {
                     case DETACH_ALL:

Modified: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java?rev=1172911&r1=1172910&r2=1172911&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java (original)
+++ openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java Tue Sep 20 00:02:37 2011
@@ -29,6 +29,8 @@ import javax.persistence.*;
 @Embeddable
 public class Geocode extends BaseEntity {
     float latitude, longtitude;
+    
+    NestedEmbeddable nestedEmbed;
 
     public float getLatitude() {
         return latitude;
@@ -45,4 +47,12 @@ public class Geocode extends BaseEntity 
     public void setLongtitude(float longtitude) {
         this.longtitude = longtitude;
     }
+    
+    public NestedEmbeddable getNestedEmbed() {
+    	return nestedEmbed;
+    }
+    
+	public void setNestedEmbed(NestedEmbeddable ne) {
+		this.nestedEmbed = ne;
+	}    
 }
\ No newline at end of file

Added: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java?rev=1172911&view=auto
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java (added)
+++ openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java Tue Sep 20 00:02:37 2011
@@ -0,0 +1,27 @@
+package org.apache.openjpa.persistence.embed;
+
+import javax.persistence.Embeddable;
+
+@Embeddable
+public class NestedEmbeddable
+{
+  private String field1;
+  private String field2;
+
+  public String getField1()
+  {
+    return this.field1;
+  }
+
+  public void setField1(String field1) {
+    this.field1 = field1;
+  }
+
+  public String getField2() {
+    return this.field2;
+  }
+
+  public void setField2(String field2) {
+    this.field2 = field2;
+  }
+}

Propchange: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/NestedEmbeddable.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbedded.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbedded.java?rev=1172911&r1=1172910&r2=1172911&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbedded.java (original)
+++ openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbedded.java Tue Sep 20 00:02:37 2011
@@ -27,7 +27,7 @@ import org.apache.openjpa.persistence.te
 
 public class TestEmbedded extends SingleEMFTestCase {
     public void setUp() {
-        super.setUp(BaseEntity.class, Address.class, Geocode.class,
+        super.setUp(BaseEntity.class, Address.class, Geocode.class, NestedEmbeddable.class,
                 CLEAR_TABLES);
     }
 
@@ -76,6 +76,79 @@ public class TestEmbedded extends Single
 
         assertEquals(a2.getGeocode().getLatitude(), 1.0f);
     }
+    
+    /**
+     * JIRA Ref: OPENJPA-1226: Create and persist a NestedEmbeddable, then
+     * update and merge the NestedEmbeddable in order to verify an 
+     * 'ArgumentException' is not caused during the merge.
+     */
+    public void testNestedEmbeddable_UpdateExistingEmbed() {
+        Address a = new Address();
+        a.setStreetAddress("456 Main St");
+        Geocode g = new Geocode();
+        g.setLatitude(1.0f);
+        NestedEmbeddable ne = new NestedEmbeddable();
+        ne.setField1("test");
+        g.setNestedEmbed(ne);
+        a.setGeocode(g);
+
+        persistAddress(a);
+
+        g = a.getGeocode();       
+        ne = g.getNestedEmbed();
+        ne.setField1("test2");
+        ne.setField2("test3");
+        
+        g.setNestedEmbed(ne);
+        a.setGeocode(g);
+        
+        mergeAddress(a);      
+ 	
+        a =
+                 queryAddresses(
+                "select address from Address address"
+                    + " where address.streetAddress = '456 Main St'").get(0);
+        
+        ne = a.getGeocode().getNestedEmbed();
+        
+        assertEquals(ne.getField1(),"test2");
+        assertEquals(ne.getField2(),"test3");
+    }
+     
+    /**
+     * JIRA Ref: OPENJPA-1226: Create a NestedEmbeddable, and add it to an
+     * existing Address/Geocode, and then merge the NestedEmbeddable in
+     * order to verify an 'ArgumentException' is not caused during the merge.
+     */
+    public void testNestedEmbeddable_AddNewEmbed() {
+        Address a = new Address();
+        a.setStreetAddress("456 Main St");
+        Geocode g = new Geocode();
+        g.setLatitude(1.0f);
+        a.setGeocode(g);
+
+        persistAddress(a);
+
+        g = a.getGeocode();       
+
+        NestedEmbeddable ne = new NestedEmbeddable();
+        ne.setField1("test");
+        
+        g.setNestedEmbed(ne);       
+        a.setGeocode(g);
+        
+        mergeAddress(a);      
+ 	
+        a =
+            queryAddresses(
+                "select address from Address address"
+                    + " where address.streetAddress = '456 Main St'").get(0);
+        
+        ne = a.getGeocode().getNestedEmbed();
+        
+        assertEquals(ne.getField1(),"test");
+        assertEquals(ne.getField2(),null);
+    }    
 
     private void persistAddress(Address address) {
         final EntityManager em = emf.createEntityManager();
@@ -95,6 +168,23 @@ public class TestEmbedded extends Single
         assertEquals(address.getGeocode().getLatitude(), 1.0f);
     }
 
+    private void mergeAddress(Address address) {
+        final EntityManager em = emf.createEntityManager();
+        final EntityTransaction tx = em.getTransaction();
+
+        tx.begin();
+
+        try {
+            em.merge(address);
+            tx.commit();
+        } finally {
+            if (tx.isActive()) {
+                tx.rollback();
+            }
+            em.close();
+        }
+    }
+    
     private List<Address> queryAddresses(String query) {
         final EntityManager em = emf.createEntityManager();
         final EntityTransaction tx = em.getTransaction();