/** * Given an EntityManager return the EntityManagerFactory that created it. This method must be called * on an open entity manager and will return null if called on a closed entityManager. * * This method will return null for non-EclipseLink EntityManagers. * * @see JpaEntityManagerFactory */ public static JpaEntityManagerFactory getEntityManagerFactory(javax.persistence.EntityManager em) { JpaEntityManager entityManager = getEntityManager(em); if (entityManager != null){ if (entityManager.getEntityManagerFactory() != null){ return ((EntityManagerFactoryDelegate)entityManager.getEntityManagerFactory()).getOwner(); } } return null; }
@Override public int executeUpdate() { JpaQuery<T> jpaQuery = getQuery(); DatabaseQuery databaseQuery = jpaQuery.getDatabaseQuery(); Class referenceClass = databaseQuery.getReferenceClass(); boolean isDeleteQuery = databaseQuery.isDeleteObjectQuery() || databaseQuery.isDeleteAllQuery(); boolean enableDeleteInSoftDeleteMode = Boolean.parseBoolean(AppContext.getProperty("cuba.enableDeleteStatementInSoftDeleteMode")); if (!enableDeleteInSoftDeleteMode && entityManager.isSoftDeletion() && isDeleteQuery) { if (SoftDelete.class.isAssignableFrom(referenceClass)) { throw new UnsupportedOperationException("Delete queries are not supported with enabled soft deletion. " + "Use 'cuba.enableDeleteStatementInSoftDeleteMode' application property to roll back to legacy behavior."); } } // In some cache configurations (in particular, when shared cache is on, but for some entities cache is set to ISOLATED), // EclipseLink does not evict updated entities from cache automatically. Cache cache = jpaQuery.getEntityManager().getEntityManagerFactory().getCache(); if (referenceClass != null) { cache.evict(referenceClass); queryCacheMgr.invalidate(referenceClass, true); } else { cache.evictAll(); queryCacheMgr.invalidateAll(true); } preExecute(jpaQuery); return jpaQuery.executeUpdate(); }