From 388b18650f0f4f480ce64b73165fcbe3e51f88ca Mon Sep 17 00:00:00 2001 From: Catalina Wei Date: Tue, 25 Aug 2009 01:19:32 +0000 Subject: [PATCH] OPENJPA-1112 JPA2 Query result of embeddable object can not be further updated git-svn-id: https://svn.apache.org/repos/asf/openjpa/trunk@807446 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/kernel/StateManagerImpl.java | 3 +- .../openjpa/persistence/embed/Geocode.java | 2 +- .../embed/TestUpdateEmbeddedQueryResult.java | 67 ++++++++++++++++++- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java index d14490f82..a44476ee1 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StateManagerImpl.java @@ -1630,8 +1630,7 @@ public class StateManagerImpl private boolean isEmbeddedNotUpdatable() { // embeddable object returned from query result is not uptable - return (_ownerId != null || - _state instanceof ENonTransState); + return (_owner == null && _ownerId != null); } /** diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java index 8537bfb8c..b555222a6 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/Geocode.java @@ -27,7 +27,7 @@ import javax.persistence.*; * */ @Embeddable -public class Geocode extends BaseEntity { +public class Geocode { float latitude, longtitude; public float getLatitude() { diff --git a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java index ba58ba96a..32f50ee04 100644 --- a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java +++ b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestUpdateEmbeddedQueryResult.java @@ -34,10 +34,75 @@ public class TestUpdateEmbeddedQueryResult extends SingleEMFTestCase { 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
list = (List
) 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 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();