You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/08/25 03:19:33 UTC

svn commit: r807446 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/

Author: fancy
Date: Tue Aug 25 01:19:32 2009
New Revision: 807446

URL: http://svn.apache.org/viewvc?rev=807446&view=rev
Log:
OPENJPA-1112 JPA2 Query result of embeddable object can not be further updated

Modified:
    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/embed/Geocode.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java

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=807446&r1=807445&r2=807446&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 Aug 25 01:19:32 2009
@@ -1630,8 +1630,7 @@
 
     private boolean isEmbeddedNotUpdatable() {
         // embeddable object returned from query result is not uptable
-        return (_ownerId != null ||
-            _state instanceof ENonTransState);
+        return (_owner == null && _ownerId != null);
     }
 
     /**

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java?rev=807446&r1=807445&r2=807446&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java Tue Aug 25 01:19:32 2009
@@ -27,7 +27,7 @@
  *
  */
 @Embeddable
-public class Geocode extends BaseEntity {
+public class Geocode {
     float latitude, longtitude;
 
     public float getLatitude() {

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java?rev=807446&r1=807445&r2=807446&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java Tue Aug 25 01:19:32 2009
@@ -34,10 +34,75 @@
     public void setUp() {
         setUp(Embed.class,
             Embed_Embed.class, 
-            EntityA_Embed_Embed.class, 
+            EntityA_Embed_Embed.class,
+            BaseEntity.class, Address.class, Geocode.class,
             DROP_TABLES);
     }
 
+    public void testUpdateEmbedded() {
+        EntityManager em = emf.createEntityManager();
+        Address a = new Address();
+        a.setStreetAddress("555 Bailey Ave");
+        a.setCity("San Jose");
+        a.setState("CA");
+        a.setZip(12955);
+        Geocode g = new Geocode();
+        g.setLatitude(1.0f);
+        g.setLongtitude(2.0f);
+        a.setGeocode(g);
+        em.getTransaction().begin();        
+        em.persist(a);
+        em.getTransaction().commit();
+
+        em.clear();
+        em.getTransaction().begin();
+        String query = "select address from Address address" +
+            " where address.streetAddress = '555 Bailey Ave'";
+        List<Address> list = (List<Address>) em.createQuery(query).getResultList();
+        Address a1 = list.get(0);
+
+        assertEquals(a1.getGeocode().getLatitude(),1.0f);
+        
+        Long id = a1.getId();
+
+        g = new Geocode();
+        g.setLatitude(3.0f);
+        g.setLongtitude(4.0f);
+        a1.setGeocode(g);
+
+        em.getTransaction().commit();
+
+        Address a2 = em.find(Address.class, id);
+        assertEquals(a2.getGeocode().getLatitude(),3.0f);
+
+        em.getTransaction().begin();
+        g.setLatitude(5.0f);
+        a2.setGeocode(g);
+        em.getTransaction().commit();
+
+        em.clear();
+        Address a3 = em.find(Address.class, id);
+        assertEquals(a3.getGeocode().getLatitude(),5.0f);
+
+        em.clear();
+        query = "select a.geocode from Address a where a.id = ?1";
+        List<Geocode> rs = em.createQuery(query).setParameter(1, id).getResultList();
+        Geocode g2 = rs.get(0);
+        em.getTransaction().begin();
+        try {
+            g2.setLatitude(7.0f);
+        } catch (ArgumentException e) {
+            //as expected: update of embeddable field in query result is not allowed.
+        }
+
+        try {
+            em.getTransaction().commit();
+        } catch (RollbackException e) {
+            //as expected: update of embeddable field in query result is not allowed.
+        }
+        em.close();
+    }
+
     public void testEntityA_Embed_Embed_update() {
         createEntityA_Embed_Embed();
         updateEmbedded_EntityA_Embed_Embed();