This is an automated email from the ASF dual-hosted git repository.

egonzalez pushed a commit to branch main
in repository 
https://gitbox.apache.org/repos/asf/incubator-kie-kogito-runtimes.git


The following commit(s) were added to refs/heads/main by this push:
     new f0b82d517a [ncubator-kie-issues-1928] UserTasks JPA Storage Reduce 
number of queries when storing named data (#3897)
f0b82d517a is described below

commit f0b82d517a8eb9001a4933ceba8e13e9db643d9c
Author: Pere Fernández <[email protected]>
AuthorDate: Fri May 2 09:42:55 2025 +0200

    [ncubator-kie-issues-1928] UserTasks JPA Storage Reduce number of queries 
when storing named data (#3897)
---
 .../jbpm/usertask/jpa/JPAUserTaskInstances.java    | 12 +++-------
 .../jpa/mapper/TaskInputsEntityMapper.java         |  3 ++-
 .../jpa/mapper/TaskMetadataEntityMapper.java       |  4 +++-
 .../jpa/mapper/TaskOutputsEntityMapper.java        |  3 ++-
 .../jbpm/usertask/jpa/model/AttachmentEntity.java  |  2 +-
 .../usertask/jpa/model/TaskDeadlineEntity.java     |  2 +-
 .../jpa/model/TaskDeadlineTimerEntity.java         |  2 +-
 .../jbpm/usertask/jpa/model/TaskInputEntity.java   |  5 +++-
 .../usertask/jpa/model/TaskMetadataEntity.java     |  3 ++-
 .../jbpm/usertask/jpa/model/TaskOutputEntity.java  |  3 ++-
 .../usertask/jpa/model/TaskReassignmentEntity.java |  2 +-
 .../jpa/model/TaskReassignmentTimerEntity.java     |  2 +-
 .../usertask/jpa/model/UserTaskInstanceEntity.java | 27 ++++++++--------------
 .../usertask/jpa/repository/BaseRepository.java    |  4 +++-
 .../jpa/repository/UserTaskInstanceRepository.java |  9 ++++++++
 .../usertask/jpa/JPAUserTaskInstancesTest.java     | 18 +--------------
 .../jbpm/usertask/jpa/mapper/utils/TestUtils.java  | 15 +++++++-----
 .../handler/UserTaskKogitoWorkItemHandler.java     | 25 ++++++++++----------
 .../usertask/impl/DefaultUserTaskInstance.java     |  6 +----
 .../BaseQuarkusJPAUserTaskInstancesTest.java       | 13 ++++-------
 .../src/main/resources/application.properties      |  2 ++
 21 files changed, 75 insertions(+), 87 deletions(-)

diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/JPAUserTaskInstances.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/JPAUserTaskInstances.java
index d2f6a5e4cb..c68d759324 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/JPAUserTaskInstances.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/JPAUserTaskInstances.java
@@ -68,20 +68,14 @@ public class JPAUserTaskInstances implements 
UserTaskInstances {
 
     @Override
     public UserTaskInstance create(UserTaskInstance userTaskInstance) {
-        Optional<UserTaskInstanceEntity> optional = 
userTaskInstanceRepository.findById(userTaskInstance.getId());
-
-        if (optional.isPresent()) {
-            LOGGER.error("Cannot create userTaskInstance with id {}. Task 
Already exists.", userTaskInstance.getId());
-            throw new IllegalArgumentException("Cannot create userTaskInstance 
with id " + userTaskInstance.getId() + ". Task Already exists.");
-        }
 
         UserTaskInstanceEntity entity = new UserTaskInstanceEntity();
         entity.setId(userTaskInstance.getId());
 
-        this.userTaskInstanceRepository.persist(entity);
-
         userTaskInstanceEntityMapper.mapTaskInstanceToEntity(userTaskInstance, 
entity);
 
+        this.userTaskInstanceRepository.persist(entity);
+
         return this.reconnectUserTaskInstance.apply(userTaskInstance);
     }
 
@@ -113,7 +107,7 @@ public class JPAUserTaskInstances implements 
UserTaskInstances {
             throw new RuntimeException("Could not remove userTaskInstance with 
id " + userTaskInstance.getId() + ", userTaskInstance cannot be found");
         }
 
-        this.userTaskInstanceRepository.remove(optional.get());
+        this.userTaskInstanceRepository.delete(optional.get());
         return this.disconnectUserTaskInstance.apply(userTaskInstance);
     }
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskInputsEntityMapper.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskInputsEntityMapper.java
index a61ffabcdd..d088af53a3 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskInputsEntityMapper.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskInputsEntityMapper.java
@@ -59,11 +59,12 @@ public class TaskInputsEntityMapper implements EntityMapper 
{
                 userTaskInstanceEntity.addInput(entity);
                 return entity;
             });
-            inputEntity.setName(key);
+
             if (Objects.nonNull(value)) {
                 
inputEntity.setValue(JSONUtils.valueToString(value).getBytes(StandardCharsets.UTF_8));
                 inputEntity.setJavaType(value.getClass().getName());
             }
+            repository.persist(inputEntity);
         });
     }
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskMetadataEntityMapper.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskMetadataEntityMapper.java
index b4af4fc8a9..18fa39dc2c 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskMetadataEntityMapper.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskMetadataEntityMapper.java
@@ -54,14 +54,16 @@ public class TaskMetadataEntityMapper implements 
EntityMapper {
         userTaskInstance.getMetadata().forEach((key, value) -> {
             TaskMetadataEntity metadataEntity = 
userTaskInstanceEntity.getMetadata().stream().filter(entity -> 
entity.getName().equals(key)).findFirst().orElseGet(() -> {
                 TaskMetadataEntity entity = new TaskMetadataEntity();
+                entity.setName(key);
                 userTaskInstanceEntity.addMetadata(entity);
                 return entity;
             });
-            metadataEntity.setName(key);
+
             if (Objects.nonNull(value)) {
                 metadataEntity.setValue(JSONUtils.valueToString(value));
                 metadataEntity.setJavaType(value.getClass().getName());
             }
+            repository.persist(metadataEntity);
         });
     }
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskOutputsEntityMapper.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskOutputsEntityMapper.java
index 5f93dd53ee..131de03617 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskOutputsEntityMapper.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/mapper/TaskOutputsEntityMapper.java
@@ -59,11 +59,12 @@ public class TaskOutputsEntityMapper implements 
EntityMapper {
                 userTaskInstanceEntity.addOutput(entity);
                 return entity;
             });
-            outputEntity.setName(key);
+
             if (Objects.nonNull(value)) {
                 
outputEntity.setValue(JSONUtils.valueToString(value).getBytes(StandardCharsets.UTF_8));
                 outputEntity.setJavaType(value.getClass().getName());
             }
+            repository.persist(outputEntity);
         });
     }
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/AttachmentEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/AttachmentEntity.java
index 57b6fb8f02..0ab9751bf9 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/AttachmentEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/AttachmentEntity.java
@@ -41,7 +41,7 @@ public class AttachmentEntity {
     @Column(name = "updated_at")
     private Date updatedAt;
 
-    @ManyToOne
+    @ManyToOne(optional = false)
     @JoinColumn(name = "task_id", foreignKey = @ForeignKey(name = 
"fk_user_tasks_attachments_tid"))
     private UserTaskInstanceEntity taskInstance;
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineEntity.java
index 35f790adb1..c753a1efcd 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineEntity.java
@@ -38,7 +38,7 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"notification_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_deadline_tid")))
+        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "fk_jbpm_user_tasks_deadline_tid")))
 public class TaskDeadlineEntity extends TaskTimerConfigEntity<byte[]> {
 
     @Column(name = "notification_type")
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineTimerEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineTimerEntity.java
index 0c3d762f22..f9cc531970 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineTimerEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskDeadlineTimerEntity.java
@@ -39,7 +39,7 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"notification_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_deadline_timer_tid")))
+        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "fk_jbpm_user_tasks_deadline_timer_tid")))
 public class TaskDeadlineTimerEntity extends TaskTimerDataEntity<byte[]> {
 
     @Column(name = "notification_type")
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskInputEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskInputEntity.java
index 3439ed45fd..e55be2ab16 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskInputEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskInputEntity.java
@@ -25,6 +25,7 @@ import jakarta.persistence.AttributeOverrides;
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
 import jakarta.persistence.ForeignKey;
+import jakarta.persistence.JoinColumn;
 import jakarta.persistence.Table;
 
 @Entity
@@ -33,7 +34,9 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "name", column = @Column(name = 
"input_name")),
         @AttributeOverride(name = "value", column = @Column(name = 
"input_value"))
 })
-@AssociationOverride(name = "taskInstance", foreignKey = @ForeignKey(name = 
"jbpm_user_tasks_inputs_tid"))
+@AssociationOverride(name = "taskInstance",
+        joinColumns = @JoinColumn(name = "task_id"),
+        foreignKey = @ForeignKey(name = "fk_jbpm_user_tasks_inputs_tid"))
 public class TaskInputEntity extends TaskNamedDataEntity<byte[]> {
 
 }
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskMetadataEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskMetadataEntity.java
index b7d05701c8..0edf3b224a 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskMetadataEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskMetadataEntity.java
@@ -35,7 +35,8 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"metadata_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_metadata_tid")))
+        joinColumns = { @JoinColumn(name = "task_id") },
+        foreignKey = @ForeignKey(name = "fk_jbpm_user_tasks_metadata_tid"))
 public class TaskMetadataEntity extends TaskNamedDataEntity<String> {
 
 }
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskOutputEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskOutputEntity.java
index 7961dcecc9..1f8b233f34 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskOutputEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskOutputEntity.java
@@ -35,7 +35,8 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"output_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_outputs_tid")))
+        joinColumns = @JoinColumn(name = "task_id"),
+        foreignKey = @ForeignKey(name = "fk_jbpm_user_tasks_outputs_tid"))
 public class TaskOutputEntity extends TaskNamedDataEntity<byte[]> {
 
 }
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentEntity.java
index 9bd409cd7d..d6c5c41dac 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentEntity.java
@@ -38,7 +38,7 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"reassignment_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_reassignment_tid")))
+        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "fk_jbpm_user_tasks_reassignment_tid")))
 public class TaskReassignmentEntity extends TaskTimerConfigEntity<byte[]> {
 
     @Column(name = "reassignment_type")
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentTimerEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentTimerEntity.java
index 8b735917c5..e01e08a01f 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentTimerEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/TaskReassignmentTimerEntity.java
@@ -39,7 +39,7 @@ import jakarta.persistence.Table;
         @AttributeOverride(name = "value", column = @Column(name = 
"reassignment_value"))
 })
 @AssociationOverride(name = "taskInstance",
-        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "jbpm_user_tasks_reassignment_timer_tid")))
+        joinColumns = @JoinColumn(name = "task_id", foreignKey = 
@ForeignKey(name = "fk_jbpm_user_tasks_reassignment_timer_tid")))
 public class TaskReassignmentTimerEntity extends TaskTimerDataEntity<byte[]> {
 
     @Column(name = "reassignment_type")
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/UserTaskInstanceEntity.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/UserTaskInstanceEntity.java
index b721f0ce3f..3ce3593d16 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/UserTaskInstanceEntity.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/model/UserTaskInstanceEntity.java
@@ -26,18 +26,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 
-import jakarta.persistence.CascadeType;
-import jakarta.persistence.CollectionTable;
-import jakarta.persistence.Column;
-import jakarta.persistence.ElementCollection;
-import jakarta.persistence.Entity;
-import jakarta.persistence.FetchType;
-import jakarta.persistence.ForeignKey;
-import jakarta.persistence.Id;
-import jakarta.persistence.JoinColumn;
-import jakarta.persistence.NamedQuery;
-import jakarta.persistence.OneToMany;
-import jakarta.persistence.Table;
+import jakarta.persistence.*;
 
 @Entity
 @NamedQuery(name = UserTaskInstanceEntity.GET_INSTANCES_BY_IDENTITY,
@@ -49,9 +38,13 @@ import jakarta.persistence.Table;
                 "or adminGroups in (:roles) " +
                 "or (:userId member of userTask.potentialUsers and :userId not 
member of userTask.excludedUsers) " +
                 "or potentialGroups in (:roles)")
+@NamedNativeQuery(
+        name = UserTaskInstanceEntity.DELETE_BY_ID,
+        query = "delete from jbpm_user_tasks where id = :taskId")
 @Table(name = "jbpm_user_tasks")
 public class UserTaskInstanceEntity {
     public static final String GET_INSTANCES_BY_IDENTITY = 
"UserTaskInstanceEntity.GetInstanceByIdentity";
+    public static final String DELETE_BY_ID = 
"UserTaskInstanceEntity.DeleteById";
 
     @Id
     private String id;
@@ -79,29 +72,29 @@ public class UserTaskInstanceEntity {
     @Column(name = "external_reference_id")
     private String externalReferenceId;
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "jbpm_user_tasks_potential_users", joinColumns = 
@JoinColumn(name = "task_id", foreignKey = @ForeignKey(name = 
"fk_jbpm_user_tasks_potential_users_tid")))
     @Column(name = "user_id", nullable = false)
     private Set<String> potentialUsers = new HashSet<>();
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "jbpm_user_tasks_potential_groups", joinColumns = 
@JoinColumn(name = "task_id"),
             foreignKey = @ForeignKey(name = 
"fk_jbpm_user_tasks_potential_groups_tid"))
     @Column(name = "group_id")
     private Set<String> potentialGroups = new HashSet<>();
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "jbpm_user_tasks_admin_users", joinColumns = 
@JoinColumn(name = "task_id", foreignKey = @ForeignKey(name = 
"fk_jbpm_user_tasks_admin_users_tid")))
     @Column(name = "user_id", nullable = false)
     private Set<String> adminUsers = new HashSet<>();
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "jbpm_user_tasks_admin_groups", joinColumns = 
@JoinColumn(name = "task_id"),
             foreignKey = @ForeignKey(name = 
"fk_jbpm_user_tasks_admin_groups_tid"))
     @Column(name = "group_id")
     private Set<String> adminGroups = new HashSet<>();
 
-    @ElementCollection
+    @ElementCollection(fetch = FetchType.EAGER)
     @CollectionTable(name = "jbpm_user_tasks_excluded_users", joinColumns = 
@JoinColumn(name = "task_id", foreignKey = @ForeignKey(name = 
"fk_jbpm_user_tasks_excluded_users_tid")))
     @Column(name = "user_id", nullable = false)
     private Set<String> excludedUsers = new HashSet<>();
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/BaseRepository.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/BaseRepository.java
index ed144ddbc0..ad03a67b6d 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/BaseRepository.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/BaseRepository.java
@@ -47,7 +47,9 @@ public abstract class BaseRepository<T, K> {
     }
 
     public T update(T entity) {
-        return this.getEntityManager().merge(entity);
+        this.getEntityManager().merge(entity);
+        this.getEntityManager().flush();
+        return entity;
     }
 
     public T remove(T entity) {
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/UserTaskInstanceRepository.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/UserTaskInstanceRepository.java
index 1be6a4aec7..6c62b15175 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/UserTaskInstanceRepository.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/main/java/org/jbpm/usertask/jpa/repository/UserTaskInstanceRepository.java
@@ -26,6 +26,7 @@ import org.kie.kogito.auth.IdentityProvider;
 
 import jakarta.persistence.TypedQuery;
 
+import static org.jbpm.usertask.jpa.model.UserTaskInstanceEntity.DELETE_BY_ID;
 import static 
org.jbpm.usertask.jpa.model.UserTaskInstanceEntity.GET_INSTANCES_BY_IDENTITY;
 
 public class UserTaskInstanceRepository extends 
BaseRepository<UserTaskInstanceEntity, String> {
@@ -41,6 +42,14 @@ public class UserTaskInstanceRepository extends 
BaseRepository<UserTaskInstanceE
         return query.getResultList();
     }
 
+    public UserTaskInstanceEntity delete(UserTaskInstanceEntity entity) {
+        getEntityManager().detach(entity);
+        getEntityManager().createNamedQuery(DELETE_BY_ID)
+                .setParameter("taskId", entity.getId())
+                .executeUpdate();
+        return entity;
+    }
+
     @Override
     public Class<UserTaskInstanceEntity> getEntityClass() {
         return UserTaskInstanceEntity.class;
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/JPAUserTaskInstancesTest.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/JPAUserTaskInstancesTest.java
index b93b54e51e..dda0fc58e3 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/JPAUserTaskInstancesTest.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/JPAUserTaskInstancesTest.java
@@ -158,8 +158,6 @@ public class JPAUserTaskInstancesTest {
 
     @Test
     public void testSuccessfulCreate() {
-        
when(userTaskInstanceRepository.findById(any())).thenReturn(Optional.empty());
-
         jpaUserTaskInstances.create(TestUtils.createUserTaskInstance());
 
         verify(userTaskInstanceRepository, times(1)).persist(any());
@@ -167,20 +165,6 @@ public class JPAUserTaskInstancesTest {
         verify(reconnectUserTaskInstance, times(1)).apply(any());
     }
 
-    @Test
-    public void testUnSuccessfulCreate() {
-        Optional<UserTaskInstanceEntity> result = 
Optional.of(TestUtils.createUserTaskInstanceEntity());
-        when(userTaskInstanceRepository.findById(any())).thenReturn(result);
-
-        Assertions.assertThatThrownBy(() -> {
-            jpaUserTaskInstances.create(TestUtils.createUserTaskInstance());
-        }).hasMessageContaining("Task Already exists.");
-
-        verify(userTaskInstanceRepository, never()).persist(any());
-        verify(userTaskInstanceEntityMapper, 
never()).mapTaskInstanceToEntity(any(), any());
-        verify(reconnectUserTaskInstance, never()).apply(any());
-    }
-
     @Test
     public void testSuccessfulUpdate() {
         Optional<UserTaskInstanceEntity> result = 
Optional.of(TestUtils.createUserTaskInstanceEntity());
@@ -211,7 +195,7 @@ public class JPAUserTaskInstancesTest {
 
         jpaUserTaskInstances.remove(TestUtils.createUserTaskInstance());
 
-        verify(userTaskInstanceRepository, times(1)).remove(any());
+        verify(userTaskInstanceRepository, times(1)).delete(any());
         verify(disconnectUserTaskInstance, times(1)).apply(any());
     }
 
diff --git 
a/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/mapper/utils/TestUtils.java
 
b/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/mapper/utils/TestUtils.java
index 0d501f1478..de17e0084c 100644
--- 
a/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/mapper/utils/TestUtils.java
+++ 
b/addons/common/jbpm-usertask-storage-jpa/src/test/java/org/jbpm/usertask/jpa/mapper/utils/TestUtils.java
@@ -282,12 +282,15 @@ public class TestUtils {
 
         instance.setExternalReferenceId("external-reference-id");
 
-        instance.setMetadata("ProcessId", "process-id");
-        instance.setMetadata("ProcessType", "BPMN");
-        instance.setMetadata("ProcessVersion", "1.0.0");
-        instance.setMetadata("boolean", true);
-        instance.setMetadata("integer", 0);
-        instance.setMetadata("null", 0);
+        Map<String, Object> metadata = new HashMap<>();
+        metadata.put("ProcessId", "process-id");
+        metadata.put("ProcessType", "BPMN");
+        metadata.put("ProcessVersion", "1.0.0");
+        metadata.put("boolean", true);
+        metadata.put("integer", 0);
+        metadata.put("null", 0);
+
+        instance.setMetadata(metadata);
 
         instance.setInput("in_string", "hello this is a string");
         instance.setInput("in_integer", 1);
diff --git 
a/jbpm/jbpm-usertask-workitem/src/main/java/org/kie/kogito/jbpm/usertask/handler/UserTaskKogitoWorkItemHandler.java
 
b/jbpm/jbpm-usertask-workitem/src/main/java/org/kie/kogito/jbpm/usertask/handler/UserTaskKogitoWorkItemHandler.java
index 4dabe08091..80a6ad977e 100644
--- 
a/jbpm/jbpm-usertask-workitem/src/main/java/org/kie/kogito/jbpm/usertask/handler/UserTaskKogitoWorkItemHandler.java
+++ 
b/jbpm/jbpm-usertask-workitem/src/main/java/org/kie/kogito/jbpm/usertask/handler/UserTaskKogitoWorkItemHandler.java
@@ -18,9 +18,7 @@
  */
 package org.kie.kogito.jbpm.usertask.handler;
 
-import java.util.Collections;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 
 import org.jbpm.workflow.core.node.HumanTaskNode;
 import org.kie.kogito.Application;
@@ -90,15 +88,18 @@ public class UserTaskKogitoWorkItemHandler extends 
DefaultKogitoWorkItemHandler
         instance.setTaskPriority(priority != null ? priority.toString() : 
null);
         instance.setSlaDueDate(workItem.getNodeInstance().getSlaDueDate());
 
-        instance.setMetadata("ProcessId", 
workItem.getProcessInstance().getProcessId());
-        instance.setMetadata("ProcessType", 
workItem.getProcessInstance().getProcess().getType());
-        instance.setMetadata("ProcessVersion", 
workItem.getProcessInstance().getProcessVersion());
-        instance.setMetadata("ProcessInstanceId", 
workItem.getProcessInstance().getId());
-        instance.setMetadata("ProcessInstanceState", 
workItem.getProcessInstance().getState());
-        instance.setMetadata("RootProcessId", 
workItem.getProcessInstance().getRootProcessId());
-        instance.setMetadata("RootProcessInstanceId", 
workItem.getProcessInstance().getRootProcessInstanceId());
-        instance.setMetadata("ParentProcessInstanceId", 
workItem.getProcessInstance().getParentProcessInstanceId());
-        instance.setMetadata("NodeInstanceId", 
workItem.getNodeInstance().getId());
+        Map<String, Object> metadata = new HashMap<>();
+        metadata.put("ProcessId", 
workItem.getProcessInstance().getProcessId());
+        metadata.put("ProcessType", 
workItem.getProcessInstance().getProcess().getType());
+        metadata.put("ProcessVersion", 
workItem.getProcessInstance().getProcessVersion());
+        metadata.put("ProcessInstanceId", 
workItem.getProcessInstance().getId());
+        metadata.put("ProcessInstanceState", 
workItem.getProcessInstance().getState());
+        metadata.put("RootProcessId", 
workItem.getProcessInstance().getRootProcessId());
+        metadata.put("RootProcessInstanceId", 
workItem.getProcessInstance().getRootProcessInstanceId());
+        metadata.put("ParentProcessInstanceId", 
workItem.getProcessInstance().getParentProcessInstanceId());
+        metadata.put("NodeInstanceId", workItem.getNodeInstance().getId());
+
+        instance.setMetadata(metadata);
 
         instance.fireInitialStateChange();
         workItem.getParameters().entrySet().stream().filter(e -> 
!HumanTaskNode.TASK_PARAMETERS.contains(e.getKey())).forEach(e -> 
instance.setInput(e.getKey(), e.getValue()));
diff --git 
a/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/DefaultUserTaskInstance.java
 
b/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/DefaultUserTaskInstance.java
index 84ee337f7f..6724d0fe4f 100644
--- 
a/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/DefaultUserTaskInstance.java
+++ 
b/jbpm/jbpm-usertask/src/main/java/org/kie/kogito/usertask/impl/DefaultUserTaskInstance.java
@@ -601,17 +601,13 @@ public class DefaultUserTaskInstance implements 
UserTaskInstance {
         this.comments = comments;
     }
 
-    public void setMetadata(String key, Object value) {
-        this.metadata.put(key, value);
-        updatePersistence();
-    }
-
     public Map<String, Object> getMetadata() {
         return metadata;
     }
 
     public void setMetadata(Map<String, Object> metadata) {
         this.metadata = metadata;
+        updatePersistence();
     }
 
     @Override
diff --git 
a/quarkus/addons/jbpm-usertask-storage-jpa/runtime/src/test/java/org/jbpm/usertask/jpa/quarkus/BaseQuarkusJPAUserTaskInstancesTest.java
 
b/quarkus/addons/jbpm-usertask-storage-jpa/runtime/src/test/java/org/jbpm/usertask/jpa/quarkus/BaseQuarkusJPAUserTaskInstancesTest.java
index 1bfcc273af..c9d0e570b1 100644
--- 
a/quarkus/addons/jbpm-usertask-storage-jpa/runtime/src/test/java/org/jbpm/usertask/jpa/quarkus/BaseQuarkusJPAUserTaskInstancesTest.java
+++ 
b/quarkus/addons/jbpm-usertask-storage-jpa/runtime/src/test/java/org/jbpm/usertask/jpa/quarkus/BaseQuarkusJPAUserTaskInstancesTest.java
@@ -40,6 +40,7 @@ import org.kie.kogito.usertask.model.Comment;
 import org.mockito.Mockito;
 
 import jakarta.inject.Inject;
+import jakarta.persistence.EntityExistsException;
 
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
@@ -78,7 +79,7 @@ public abstract class BaseQuarkusJPAUserTaskInstancesTest {
 
     @Test
     public void testCreateUserTask() {
-        UserTaskInstance instance = createUserTaskInstance();
+        DefaultUserTaskInstance instance = createUserTaskInstance();
 
         Assertions.assertThat(userTaskInstances.exists(instance.getId()))
                 .isFalse();
@@ -117,13 +118,7 @@ public abstract class BaseQuarkusJPAUserTaskInstancesTest {
         userTaskInstances.create(instance);
 
         Assertions.assertThatThrownBy(() -> userTaskInstances.create(instance))
-                .isInstanceOf(IllegalArgumentException.class)
-                .hasMessageContaining("Task Already exists.");
-
-        userTaskInstances.remove(instance);
-
-        Assertions.assertThat(userTaskInstances.exists(instance.getId()))
-                .isFalse();
+                .isInstanceOf(EntityExistsException.class);
     }
 
     @Test
@@ -452,7 +447,7 @@ public abstract class BaseQuarkusJPAUserTaskInstancesTest {
         TestUtils.assertUserTaskEntityMetadata(entity, instance);
     }
 
-    private UserTaskInstance createUserTaskInstance() {
+    private DefaultUserTaskInstance createUserTaskInstance() {
         DefaultUserTaskInstance instance = TestUtils.createUserTaskInstance();
 
         instance.setInstances(userTaskInstances);
diff --git 
a/quarkus/integration-tests/integration-tests-quarkus-usertasks/src/main/resources/application.properties
 
b/quarkus/integration-tests/integration-tests-quarkus-usertasks/src/main/resources/application.properties
index c4b0747666..fcadbc4248 100644
--- 
a/quarkus/integration-tests/integration-tests-quarkus-usertasks/src/main/resources/application.properties
+++ 
b/quarkus/integration-tests/integration-tests-quarkus-usertasks/src/main/resources/application.properties
@@ -22,4 +22,6 @@ 
quarkus.datasource.devservices.image-name=mirror.gcr.io/postgres:15.9-alpine3.20
 
 kogito.persistence.type=jdbc
 
+quarkus.hibernate-orm.database.generation=none
+
 kie.flyway.enabled=true


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to