diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java index 65c10223ca36198c8af4c89b81c309bfce520a98..2bd5faa8ba2b65cc192aca0af7715e83dc0ebcc3 100644 --- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java +++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java @@ -34,7 +34,10 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import javax.persistence.PersistenceException; + import org.apache.logging.log4j.Logger; +import org.hibernate.exception.ConstraintViolationException; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DB; @@ -220,7 +223,7 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx efficiencyProperty.setShortTitle(courseEnv.getRunStructure().getRootNode().getShortTitle()); efficiencyProperty.setTitle(courseEnv.getRunStructure().getRootNode().getLongTitle()); fillEfficiencyStatement(efficiencyStatement, lastModifications, efficiencyProperty); - dbInstance.getCurrentEntityManager().persist(efficiencyProperty); + efficiencyProperty = persistOrLoad(efficiencyProperty, repoEntry, assessedIdentity); if (debug) { log.debug("creating new efficiency statement property::{} for id::{} repoEntry:: {}", efficiencyProperty.getKey(), assessedIdentity.getKey() , repoEntry.getKey()); @@ -254,6 +257,23 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(ace, courseOres); } + private UserEfficiencyStatementImpl persistOrLoad(UserEfficiencyStatementImpl efficiencyProperty, RepositoryEntry entry, Identity identity) { + try { + dbInstance.commit(); + dbInstance.getCurrentEntityManager().persist(efficiencyProperty); + dbInstance.commit(); + } catch(PersistenceException e) { + if(e.getCause() instanceof ConstraintViolationException) { + log.warn("", e); + dbInstance.rollback(); + efficiencyProperty = getUserEfficiencyStatementFull(entry, identity); + } else { + log.error("", e); + } + } + return efficiencyProperty; + } + public void fillEfficiencyStatement(EfficiencyStatement efficiencyStatement, AssessmentNodesLastModified lastModifications, UserEfficiencyStatementImpl efficiencyProperty) { if(lastModifications != null) { if(lastModifications.getLastUserModified() != null