diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java index c9fc98d31..357f18a86 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java @@ -558,6 +558,10 @@ public class JPQLExpressionBuilder JPQLNode[] nodes = root().findChildrenByID(JJTUPDATEITEM); for (int i = 0; nodes != null && i < nodes.length; i++) { Path path = getPath(firstChild(nodes[i])); + if (path.last().getValue().getEmbeddedMetaData() != null) + throw parseException(EX_USER, "cant-bulk-update-embeddable", + new Object[]{assemble(firstChild(nodes[i]))}, null); + JPQLNode lastChild = lastChild(nodes[i]); Value val = (lastChild.children == null) ? null : getValue(onlyChild(lastChild)); diff --git a/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties b/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties index cfe30e7af..6533bbc44 100644 --- a/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties +++ b/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties @@ -79,4 +79,7 @@ bad-qualified-path: Attemp to navigate a basic type of Key("{0}"). bad-general-identifier: The identitier "{0}" in "{1}" operator is not valid \ in conditional expression. bad-predicate: JPQL query does not support conditional expression over \ - embeddable class. JPQL string: "{0}". \ No newline at end of file + embeddable class. JPQL string: "{0}". +cant-bulk-update-embeddable: Bulk update of embeddable field is not allowed: \ + "{0}". + \ No newline at end of file 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 64b4297d3..980b97600 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 @@ -84,6 +84,29 @@ public class TestUpdateEmbeddedQueryResult extends SingleEMFTestCase { return embed; } + /* + * + */ + public void testBulkUpdateEmbeddedField() { + EntityManager em = emf.createEntityManager(); + String update = "UPDATE EntityA_Embed_Embed a set a.embed.embed.intVal1 = ?1," + + " a.embed.embed.intVal2 = ?2 where a.id = 10"; + em.getTransaction().begin(); + int count = em.createQuery(update).setParameter(1, 100).setParameter(2, 200).executeUpdate(); + em.getTransaction().commit(); + assertEquals(count, 0); + + // test invalid bulk update embeddable field + update = "UPDATE EntityA_Embed_Embed a set a.embed.embed = ?1"; + Embed embed1 = createEmbed(ID, 10); + try { + int updateCount = em.createQuery(update).setParameter(1, embed1).executeUpdate(); + } catch (ArgumentException e) { + // as expected: Bulk update of embeddable field is not allowed. + } + em.close(); + } + /* * update embedded object returned from query */