diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java index deeb4c16d..f7acf8c56 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/orders/labels/AssignedLabelsModel.java @@ -30,6 +30,7 @@ import org.navalplanner.business.labels.daos.ILabelDAO; import org.navalplanner.business.labels.entities.Label; import org.navalplanner.business.labels.entities.LabelType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Transactional; /** @@ -126,9 +127,31 @@ public abstract class AssignedLabelsModel implements IAssignedLabelsModel return result; } + @Transactional(readOnly = true) public Label createLabel(final String labelName, final LabelType labelType) { - Label label = adHocTransactionService + Label label = createAndSaveLabelOrGetFromDatabase(labelName, labelType); + addLabelToConversation(label); + return label; + } + + private Label createAndSaveLabelOrGetFromDatabase(final String labelName, + final LabelType labelType) { + Label label; + try { + label = saveLabelOnAnotherTransaction(labelName, labelType); + label.dontPoseAsTransientObjectAnymore(); + } catch (DataIntegrityViolationException e) { + // Label was already created by another user while editing the order + label = labelDAO.findByNameAndType(labelName, labelType); + forceLoad(label); + } + return label; + } + + private Label saveLabelOnAnotherTransaction(final String labelName, + final LabelType labelType) { + return adHocTransactionService .runOnAnotherTransaction(new IOnTransaction