diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java
index 9dff1a6bb0859642307b60a3c3d13d952e36d6ef..16c76509ed1721f7068444f7208e55814ef2d8bf 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingDefinitionFacade.java
@@ -219,12 +219,6 @@ public class TrainingDefinitionFacade {
         trainingDefinitionService.update(mappedTrainingDefinition);
     }
 
-    private User createUserRefFromDTO(UserRefDTO userToBeCreated) {
-        User user = new User();
-        user.setUserRefId(userToBeCreated.getUserRefId());
-        return user;
-    }
-
     /**
      * Clones Training Definition by id
      *
@@ -359,11 +353,8 @@ public class TrainingDefinitionFacade {
             if (actualAuthorsIds.contains(author.getUserRefId())) {
                 continue;
             }
-            try {
-                trainingDefinition.addAuthor(userService.getUserByUserRefId(author.getUserRefId()));
-            } catch (EntityNotFoundException ex) {
-                trainingDefinition.addAuthor(userService.createUserRef(createUserRefFromDTO(author)));
-            }
+            User user = userService.createOrGetUserRef(author.getUserRefId());
+            trainingDefinition.addAuthor(user);
         }
     }
 
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java
index 26a530561a2de43d4c72ada4c456e3b43f88147f..69c07477ce7530f0d7493c641686f4bca7ce8a5b 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/facade/TrainingInstanceFacade.java
@@ -197,11 +197,8 @@ public class TrainingInstanceFacade {
             if (actualOrganizersIds.contains(organizer.getUserRefId())) {
                 continue;
             }
-            try {
-                trainingInstance.addOrganizer(userService.getUserByUserRefId(organizer.getUserRefId()));
-            } catch (EntityNotFoundException ex) {
-                trainingInstance.addOrganizer(userService.createUserRef(createUserRefFromDTO(organizer)));
-            }
+            User user = userService.createOrGetUserRef(organizer.getUserRefId());
+            trainingInstance.addOrganizer(user);
         }
     }
 
@@ -218,12 +215,6 @@ public class TrainingInstanceFacade {
         return users;
     }
 
-    private User createUserRefFromDTO(UserRefDTO userToBeCreated) {
-        User user = new User();
-        user.setUserRefId(userToBeCreated.getUserRefId());
-        return user;
-    }
-
     /**
      * Deletes specific training instance based on id
      *
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java
index c44943f6b5b8a2978911a320b083a0338ded996f..f42c7f7dbd3db113c4f32d97cd9efcfec1c3d4b2 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepository.java
@@ -13,7 +13,7 @@ import java.util.Set;
  * The JPA repository interface to manage {@link User} instances.
  */
 @Repository
-public interface UserRefRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User> {
+public interface UserRefRepository extends JpaRepository<User, Long>, QuerydslPredicateExecutor<User>, UserRefRepositoryCustom {
 
     /**
      * Find all users by userRefIds.
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java
new file mode 100644
index 0000000000000000000000000000000000000000..158c52862c4f19cf7a3a7c0704c070da72b59ce6
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryCustom.java
@@ -0,0 +1,22 @@
+package cz.muni.ics.kypo.training.adaptive.repository;
+
+import cz.muni.ics.kypo.training.adaptive.domain.User;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+
+
+public interface UserRefRepositoryCustom {
+
+    /**
+     * Insert user reference if it does not exist in the database.
+     *
+     * @param userRefId the user reference id
+     * @return the number of rows affected
+     */
+    @Modifying
+    @Transactional
+    User createOrGet(@Param("userRefId") Long userRefId);
+
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4324a20690d10cd00ab6a5c3333f6e3f0fd26c07
--- /dev/null
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/repository/UserRefRepositoryImpl.java
@@ -0,0 +1,41 @@
+package cz.muni.ics.kypo.training.adaptive.repository;
+
+import cz.muni.ics.kypo.training.adaptive.domain.User;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+@Repository
+public class UserRefRepositoryImpl implements UserRefRepositoryCustom {
+
+    private static final Logger LOG = LoggerFactory.getLogger(UserRefRepositoryImpl.class);
+
+    @PersistenceContext
+    private EntityManager entityManager;
+
+    @Override
+    public User createOrGet(Long userRefId) {
+        int rowsAffected = entityManager.createNativeQuery("INSERT INTO \"user\" (user_ref_id) VALUES (:userRefId)" +
+                        "ON CONFLICT DO NOTHING")
+                .setParameter("userRefId", userRefId)
+                .executeUpdate();
+
+        if (rowsAffected != 0) {
+            LOG.info("User with user_ref_id {} created", userRefId);
+        }
+
+        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
+        CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
+        Root<User> root = criteriaQuery.from(User.class);
+        criteriaBuilder.and(criteriaBuilder.equal(root.get("userRefId"), userRefId));
+        return entityManager.createQuery(criteriaQuery).getSingleResult();
+    }
+
+
+}
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java
index 6e78c324412d0ab99f439ef4d2d82c2af610762b..0a8165f796e7826e4bc831bef33ea3e12fb0f920 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/UserService.java
@@ -45,15 +45,14 @@ public class UserService {
     }
 
     /**
-     * Create new user reference
+     * If user reference with given user id does not exist, it is created and returned.
+     * Otherwise, the existing one is returned.
      *
-     * @param userToCreate user reference to be created
-     * @return created {@link User}
+     * @param userRefId id of the referenced user
+     * @return user reference with given referenced id
      */
-    @TransactionalWO
-    public User createUserRef(User userToCreate) {
-        User user = userRefRepository.save(userToCreate);
-        LOG.info("User ref with user_ref_id: {} created.", user.getUserRefId());
-        return user;
+    public User createOrGetUserRef(Long userRefId) {
+        return userRefRepository.createOrGet(userRefId);
     }
+    
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java
index 2648a26c8c6e39d74ab45e1fdb3af3803271d1f3..5005ff31179975a9c4a3a6451df55f0f2aae825d 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingDefinitionService.java
@@ -456,14 +456,7 @@ public class TrainingDefinitionService {
     }
 
     private void addLoggedInUserToTrainingDefinitionAsAuthor(TrainingDefinition trainingDefinition) {
-        Long loggedInId = userManagementServiceApi.getLoggedInUserRefId();
-        Optional<User> user = userRefRepository.findUserByUserRefId(loggedInId);
-        if (user.isPresent()) {
-            trainingDefinition.addAuthor(user.get());
-        } else {
-            User newUser = new User(loggedInId);
-            userRefRepository.saveAndFlush(newUser);
-            trainingDefinition.addAuthor(newUser);
-        }
+        User user = userRefRepository.createOrGet(userManagementServiceApi.getLoggedInUserRefId());
+        trainingDefinition.addAuthor(user);
     }
 }
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java
index 7aebe488c9409795ccaedd4256be1d248878d55a..67d73f06212b1fe0552f98c2fb8fb4c48f0f0823 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingInstanceService.java
@@ -214,13 +214,8 @@ public class TrainingInstanceService {
     }
 
     private void addLoggedInUserAsOrganizerToTrainingInstance(TrainingInstance trainingInstance) {
-        Optional<User> authorOfTrainingInstance = organizerRefRepository.findUserByUserRefId(userManagementServiceApi.getLoggedInUserRefId());
-        if (authorOfTrainingInstance.isPresent()) {
-            trainingInstance.addOrganizer(authorOfTrainingInstance.get());
-        } else {
-            User user = new User(userManagementServiceApi.getLoggedInUserRefId());
-            trainingInstance.addOrganizer(organizerRefRepository.save(user));
-        }
+        User userRef = organizerRefRepository.createOrGet(userManagementServiceApi.getLoggedInUserRefId());
+        trainingInstance.addOrganizer(userRef);
     }
 
     /**
diff --git a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java
index fd77628ae9f64bd6ce7f224a944872c3860d5793..b4b955ae315580a9b46c69a32f7d4916b5fea338 100644
--- a/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java
+++ b/src/main/java/cz/muni/ics/kypo/training/adaptive/service/training/TrainingRunService.java
@@ -590,12 +590,9 @@ public class TrainingRunService {
         TrainingRun newTrainingRun = new TrainingRun();
         newTrainingRun.setCurrentPhase(currentPhase);
 
-        Optional<User> userRefOpt = participantRefRepository.findUserByUserRefId(participantRefId);
-        if (userRefOpt.isPresent()) {
-            newTrainingRun.setParticipantRef(userRefOpt.get());
-        } else {
-            newTrainingRun.setParticipantRef(participantRefRepository.save(new User(userManagementServiceApi.getLoggedInUserRefId())));
-        }
+        User userRef = participantRefRepository.createOrGet(participantRefId);
+        newTrainingRun.setParticipantRef(userRef);
+
         newTrainingRun.setState(TRState.RUNNING);
         newTrainingRun.setTrainingInstance(trainingInstance);
         newTrainingRun.setStartTime(startTime);