Repository: deltaspike Updated Branches: refs/heads/master 32e09a540 -> 549ee2500
DELTASPIKE-948 CdiQueryInvocationContext#isNew isn't portable across jpa providers Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/549ee250 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/549ee250 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/549ee250 Branch: refs/heads/master Commit: 549ee2500d9d096e30bddb9957eac9b007f15cad Parents: 32e09a5 Author: Daniel Cunha (soro) <[email protected]> Authored: Wed Jul 8 20:27:31 2015 -0300 Committer: Daniel Cunha (soro) <[email protected]> Committed: Wed Jul 8 20:27:31 2015 -0300 ---------------------------------------------------------------------- .../impl/handler/CdiQueryInvocationContext.java | 30 ++++++++++++++++++-- .../deltaspike/data/impl/util/EntityUtils.java | 2 +- 2 files changed, 29 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/549ee250/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java index 45c3449..b0b4c67 100644 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/CdiQueryInvocationContext.java @@ -22,8 +22,8 @@ import org.apache.deltaspike.data.api.SingleResultType; import org.apache.deltaspike.data.api.mapping.QueryInOutMapper; import org.apache.deltaspike.data.impl.meta.RepositoryMethod; import org.apache.deltaspike.data.impl.param.Parameters; +import org.apache.deltaspike.data.impl.util.EntityUtils; import org.apache.deltaspike.data.impl.util.bean.Destroyable; -import org.apache.deltaspike.data.impl.util.jpa.PersistenceUnitUtilDelegateFactory; import org.apache.deltaspike.data.spi.QueryInvocationContext; import javax.persistence.EntityManager; @@ -92,7 +92,16 @@ public class CdiQueryInvocationContext implements QueryInvocationContext { try { - return PersistenceUnitUtilDelegateFactory.get(entityManager).getIdentifier(entity) == null; + if (EntityUtils.primaryKeyValue(entity) == null) + { + return true; + } + + if (!entityManager.contains(entity) && countCheck(entity)) + { + return true; + } + return false; } catch (IllegalArgumentException e) { @@ -293,4 +302,21 @@ public class CdiQueryInvocationContext implements QueryInvocationContext return extractQueryHints(method) != null; } + private boolean countCheck(Object entity) + { + StringBuilder sql = new StringBuilder("SELECT COUNT(e) FROM " + getEntityClass() + .getSimpleName() + " e "); + sql.append("WHERE e."); + sql.append(EntityUtils.primaryKey(getEntityClass()).getName()); + sql.append(" = " + EntityUtils.primaryKeyValue(entity)); + + final Query query = entityManager.createQuery(sql.toString()); + final Long result = (Long) query.getSingleResult(); + if (Long.valueOf(0).equals(result)) + { + return true; + } + return false; + } + } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/549ee250/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java index 5f5c966..0075ea5 100755 --- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java +++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/util/EntityUtils.java @@ -85,7 +85,7 @@ public final class EntityUtils return new EntityVerifier().verify(entityClass); } - private static Property<Serializable> primaryKey(Class<?> entityClass) + public static Property<Serializable> primaryKey(Class<?> entityClass) { for (PropertyCriteria c : criteriaList(entityClass)) {
