You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by jg...@apache.org on 2010/12/08 19:49:17 UTC
svn commit: r1043597 - in /openjpa/branches/2.0.x:
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
Author: jgrassel
Date: Wed Dec 8 18:49:17 2010
New Revision: 1043597
URL: http://svn.apache.org/viewvc?rev=1043597&view=rev
Log:
OPENJPA-1890: Fix NPE when an embeddable is set to a managed entity more then once, merged from Fay's changes for trunk
Modified:
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
Modified: openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java?rev=1043597&r1=1043596&r2=1043597&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java (original)
+++ openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/SingleFieldManager.java Wed Dec 8 18:49:17 2010
@@ -309,8 +309,12 @@ class SingleFieldManager
// works on external value
if ((immediate || fmd.isEmbeddedPC())
&& fmd.getCascadeDelete() == ValueMetaData.CASCADE_IMMEDIATE) {
- if (fmd.isEmbeddedPC() && deref)
- dereferenceEmbedDependent(_broker.getStateManagerImpl(objval, false));
+ if (fmd.isEmbeddedPC() && deref) {
+ StateManagerImpl sm = _broker.getStateManagerImpl(objval, false);
+ if (sm != null) {
+ dereferenceEmbedDependent(sm);
+ }
+ }
delete(fmd, objval, call);
}
else if (fmd.getCascadeDelete() == ValueMetaData.CASCADE_AUTO)
Modified: openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java?rev=1043597&r1=1043596&r2=1043597&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java (original)
+++ openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/embed/TestEmbeddable.java Wed Dec 8 18:49:17 2010
@@ -190,6 +190,20 @@ public class TestEmbeddable extends SQLL
em.close();
}
+ /**
+ * Test for OJ-1890.
+ */
+ public void testSettingEmbeddableMultipleTimesOnManagedEntity() {
+ createEntityA_Embed();
+ EntityManager em = emf.createEntityManager();
+ EntityA_Embed ee = em.find(EntityA_Embed.class, ID);
+ Embed embed = createEmbed(ID, 0);
+ ee.setEmbed(embed);
+ Embed embed1 = createEmbed(ID, 1);
+ ee.setEmbed(embed1);
+ em.close();
+ }
+
public void testEntityA_Embed_Coll_Map() {
queryEntityA_Embed_Coll_Map();
}
@@ -638,12 +652,12 @@ public class TestEmbeddable extends SQLL
a.setId(id);
a.setName("a" + id);
a.setAge(id);
- Embed_Embed embed = createEmbed_Embed(em, id, 0);
+ Embed_Embed embed = createEmbed_Embed(id, 0);
a.setEmbed(embed);
em.persist(a);
}
- public Embed_Embed createEmbed_Embed(EntityManager em, int id, int idx) {
+ public Embed_Embed createEmbed_Embed(int id, int idx) {
Embed_Embed embed = new Embed_Embed();
embed.setIntVal1(id * 100 + idx * 10 + 1);
embed.setIntVal2(id * 100 + idx * 10 + 2);
@@ -653,6 +667,26 @@ public class TestEmbeddable extends SQLL
return embed;
}
+ public void createEntityA_Embed() {
+ EntityManager em = emf.createEntityManager();
+ EntityTransaction tran = em.getTransaction();
+ createEntityA_Embed(em, ID);
+ tran.begin();
+ em.flush();
+ tran.commit();
+ em.close();
+ }
+
+ public void createEntityA_Embed(EntityManager em, int id) {
+ EntityA_Embed a = new EntityA_Embed();
+ a.setId(id);
+ a.setName("a" + id);
+ a.setAge(id);
+ Embed embed = createEmbed(id, 0);
+ a.setEmbed(embed);
+ em.persist(a);
+ }
+
public Embed createEmbed(int id, int idx) {
Embed embed = new Embed();
embed.setIntVal1(id * 100 + idx * 10 + 4);
@@ -680,7 +714,7 @@ public class TestEmbeddable extends SQLL
a.setName("a" + id);
a.setAge(id);
for (int i = 0; i < numEmbeddables; i++) {
- Embed_Embed embed = createEmbed_Embed(em, id, i);
+ Embed_Embed embed = createEmbed_Embed(id, i);
a.addEmbed(embed);
}
em.persist(a);
@@ -1066,7 +1100,7 @@ public class TestEmbeddable extends SQLL
em.clear();
em.getTransaction().begin();
- Embed_Embed embed = createEmbed_Embed(em, ID, 100);
+ Embed_Embed embed = createEmbed_Embed(ID, 100);
a.addEmbed(embed);
em.merge(a);
em.getTransaction().commit();
@@ -2849,9 +2883,9 @@ public class TestEmbeddable extends SQLL
a.addCreditRating(EntityA_Embed_Complex.CreditRating.POOR);
a.addTimestamp(new Timestamp(cal.getTimeInMillis()));
a.addLob("lob_0");
- a.setEmbed(createEmbed_Embed(em, numEmbeddables, 0));
+ a.setEmbed(createEmbed_Embed(numEmbeddables, 0));
for (int i = 0; i < numEmbeddables; i++) {
- Embed_Embed embed = createEmbed_Embed(em, id, i);
+ Embed_Embed embed = createEmbed_Embed(id, i);
a.addEmbed(embed);
}
for (int i = 0; i < numEmbeddables; i++) {