public boolean writeNextChunk(final List<T> entities) { boolean addedSomething = false; boolean rollBack = false; /*//final EntityTransaction transaction = entityManager.getTransaction(); if (entityManager.getTransaction().isActive()) { LOG.error("Transaction was already active."); } else {*/ if (entities.size() > 0) { EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); try { for (final T entity : entities) { // LOG.debug("About to persist a " + entity.getClass().getSimpleName()); if (RoleData.class.equals(entity.getClass())) { final RoleData roleData = ((RoleData) entity); final Set<Integer> accessRulesPrimaryKeys = roleData.getAccessRules().keySet(); final Set<Integer> accessUserAspectPrimaryKeys = roleData.getAccessUsers().keySet(); final Map<Integer, AccessRuleData> accessRuleMap = new HashMap<Integer, AccessRuleData>(); for (int primaryKey : accessRulesPrimaryKeys) { AccessRuleData accessRuleData = entityManager.find(AccessRuleData.class, primaryKey); if (accessRuleData == null) { accessRuleData = roleData.getAccessRules().get(primaryKey); entityManager.persist(accessRuleData); } accessRuleMap.put(primaryKey, accessRuleData); } final Map<Integer, AccessUserAspectData> accessUserAspectMap = new HashMap<Integer, AccessUserAspectData>(); for (int primaryKey : accessUserAspectPrimaryKeys) { AccessUserAspectData accessUserAspectData = entityManager.find(AccessUserAspectData.class, primaryKey); if (accessUserAspectData == null) { accessUserAspectData = roleData.getAccessUsers().get(primaryKey); entityManager.persist(accessUserAspectData); } accessUserAspectMap.put(primaryKey, accessUserAspectData); } // roleData.setAccessRules(new HashMap<Integer,AccessRuleData>()); // roleData.setAccessUsers(new HashMap<Integer,AccessUserAspectData>()); roleData.setAccessRules(accessRuleMap); roleData.setAccessUsers(accessUserAspectMap); entityManager.persist(entity); // roleData.setAccessRules(accessRuleMap); // roleData.setAccessUsers(accessUserAspectMap); // entityManager.merge(entity); } else { entityManager.persist(entity); } addedSomething = true; } } catch (Exception e) { LOG.error(e.getMessage(), e); rollBack = true; } finally { if (rollBack) { transaction.rollback(); } else { transaction.commit(); totalRowCount += entities.size(); } } // } entityManager.clear(); // Detach all entities to free up some memory. } return addedSomething; }