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();