From 662bd3c9f643b1bfcb0532d77ac082b58362d092 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 15 Jan 2018 09:14:07 +0100
Subject: [PATCH] OO-3234: remove some deprecated interfaces from DBImpl

---
 .../bps/olat/modules/cl/ChecklistManager.java |   2 +-
 .../de/bps/onyx/plugin/OnyxResultManager.java |  56 +++---
 .../basesecurity/BaseSecurityManager.java     |  35 ++--
 .../org/olat/core/commons/persistence/DB.java |  69 -------
 .../olat/core/commons/persistence/DBImpl.java | 185 +-----------------
 .../tagging/manager/TaggingManagerImpl.java   |  35 ++--
 .../coordinate/DBPersistentLockManager.java   |  12 +-
 .../service/ProjectBrokerManagerImpl.java     |  29 +--
 .../portfolio/manager/EPStructureManager.java |   3 +-
 .../java/org/olat/user/UserManagerImpl.java   |   3 +-
 .../onyx/plugin/OnyxResultManagerTest.java    | 106 ++++++++++
 .../basesecurity/BaseSecurityManagerTest.java |  23 +++
 .../olat/core/commons/persistence/DBTest.java |   4 +-
 .../DBPersistentLockManagerTest.java          | 103 ++++++++++
 .../ProjectBrokerManagerTest.java             | 120 ++++++------
 .../accesscontrol/ACOfferManagerTest.java     |   4 +-
 .../accesscontrol/ACOrderManagerTest.java     |   2 +-
 .../java/org/olat/test/AllTestsJunit4.java    |   2 +
 18 files changed, 402 insertions(+), 391 deletions(-)
 create mode 100644 src/test/java/de/bps/onyx/plugin/OnyxResultManagerTest.java
 create mode 100644 src/test/java/org/olat/core/util/coordinate/DBPersistentLockManagerTest.java

diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java b/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java
index 38a90e62c57..4ebd879c3f1 100644
--- a/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java
+++ b/src/main/java/de/bps/olat/modules/cl/ChecklistManager.java
@@ -80,7 +80,7 @@ public class ChecklistManager {
 		Checklist checklist;
 		try {
 			// load from db
-			checklist = DBFactory.getInstance().loadObject(Checklist.class, key);
+			checklist = DBFactory.getInstance().getCurrentEntityManager().find(Checklist.class, key);
 		} catch (Exception e) {
 			DBFactory.getInstance().closeSession();
 			// in case of error create new object as fallback
diff --git a/src/main/java/de/bps/onyx/plugin/OnyxResultManager.java b/src/main/java/de/bps/onyx/plugin/OnyxResultManager.java
index d025cd096e1..177fbcedf01 100644
--- a/src/main/java/de/bps/onyx/plugin/OnyxResultManager.java
+++ b/src/main/java/de/bps/onyx/plugin/OnyxResultManager.java
@@ -26,8 +26,6 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.type.StandardBasicTypes;
-import org.hibernate.type.Type;
 import org.olat.commons.lifecycle.LifeCycleManager;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.persistence.DB;
@@ -242,11 +240,11 @@ public class OnyxResultManager {
 	}
 
 	public static QTIResultSet getResultSet(final long uniqueId) {
-		final List<Long> liste = getResultSetByAssassmentId(uniqueId);
+		final List<Long> liste = getResultSetByAssessmentId(uniqueId);
 		QTIResultSet qtiResultSet = null;
 		if (liste != null && liste.size() > 0) {
 			Long key = liste.get(0);
-			qtiResultSet = DBFactory.getInstance().loadObject(QTIResultSet.class, key);
+			qtiResultSet = DBFactory.getInstance().getCurrentEntityManager().find(QTIResultSet.class, key);
 			DBFactory.getInstance().intermediateCommit();
 		}
 		return qtiResultSet;
@@ -255,11 +253,13 @@ public class OnyxResultManager {
 	public static Boolean isLastTestTry(QTIResultSet testTry) {
 		Boolean isLast = true;
 
-		String query = "select rset.key from org.olat.ims.qti.QTIResultSet rset where rset.identity=? and rset.olatResourceDetail=? and rset.creationDate >= ?";
-		@SuppressWarnings("unchecked")
-		List<Long> results = DBFactory.getInstance().find(query,
-				new Object[] { testTry.getIdentity().getKey(), testTry.getOlatResourceDetail(), testTry.getCreationDate() },
-				new Type[] { StandardBasicTypes.LONG, StandardBasicTypes.STRING, StandardBasicTypes.DATE });
+		String query = "select rset.key from org.olat.ims.qti.QTIResultSet rset where rset.identity.key=:identityKey and rset.olatResourceDetail=:subIdent and rset.creationDate>=:date";
+		List<Long> results = DBFactory.getInstance().getCurrentEntityManager()
+				.createQuery(query, Long.class)
+				.setParameter("identityKey", testTry.getIdentity().getKey())
+				.setParameter("subIdent", testTry.getOlatResourceDetail())
+				.setParameter("date", testTry.getCreationDate())
+				.getResultList();
 		for (Long result : results) {
 			if (!(testTry.getKey().equals(result)) && testTry.getKey() < result) {
 				isLast = false;
@@ -275,7 +275,7 @@ public class OnyxResultManager {
 		QTIResultSet lastResultSet = null;
 
 		for (Long resultSet : suspendedResults) {
-			QTIResultSet res = (DBFactory.getInstance().loadObject(QTIResultSet.class, resultSet));
+			QTIResultSet res = DBFactory.getInstance().getCurrentEntityManager().find(QTIResultSet.class, resultSet);
 			if (lastResultSet != null) {
 				if (lastResultSet.getCreationDate().before(res.getCreationDate())) {
 					lastResultSet = res;
@@ -288,23 +288,27 @@ public class OnyxResultManager {
 		return lastResultSet;
 	}
 
-	private static List<Long> getSuspendedQTIResultSet(Identity identity, CourseNode node) {
-		String query = "select rset.key from org.olat.ims.qti.QTIResultSet rset where rset.suspended = ? and rset.identity=? and rset.olatResourceDetail=?";
-		List<Long> results = DBFactory.getInstance().find(query, new Object[] { Boolean.TRUE, identity.getKey(), node.getIdent() },
-				new Type[] { StandardBasicTypes.BOOLEAN, StandardBasicTypes.LONG, StandardBasicTypes.STRING });
+	protected static List<Long> getSuspendedQTIResultSet(Identity identity, CourseNode node) {
+		DB db = DBFactory.getInstance();
+		String q = "select rset.key from org.olat.ims.qti.QTIResultSet rset where rset.suspended=:suspended and rset.identity.key=:identityKey and rset.olatResourceDetail=:subIdent";
+		List<Long> results = db.getCurrentEntityManager()
+				.createQuery(q, Long.class)
+				.setParameter("suspended", Boolean.TRUE)
+				.setParameter("identityKey", identity.getKey())
+				.setParameter("subIdent", node.getIdent())
+				.getResultList();
 		DBFactory.getInstance().intermediateCommit();
 		return results;
 	}
 
-	private static List<Long> getResultSetByAssassmentId(Long assessmentID) {
+	protected static List<Long> getResultSetByAssessmentId(Long assessmentID) {
 		DB db = DBFactory.getInstance();
 		db.commitAndCloseSession();
-		StringBuilder slct = new StringBuilder();
-		slct.append("select rset.key from ");
-		slct.append("org.olat.ims.qti.QTIResultSet rset ");
-		slct.append("where ");
-		slct.append("rset.assessmentID=? ");
-		List<Long> results = db.find(slct.toString(), new Object[] { assessmentID }, new Type[] { StandardBasicTypes.LONG });
+		String q = "select rset.key from org.olat.ims.qti.QTIResultSet rset where rset.assessmentID=:assessmentId";
+		List<Long> results = db.getCurrentEntityManager()
+				.createQuery(q, Long.class)
+				.setParameter("assessmentId", assessmentID)
+				.getResultList();
 		db.intermediateCommit();
 		return results;
 	}
@@ -432,12 +436,10 @@ public class OnyxResultManager {
 
 	public static List<QTIResultSet> findResultSets() {
 		final DB db = DBFactory.getInstance();
-
-		final StringBuilder slct = new StringBuilder();
-		slct.append("select rset from ");
-		slct.append("org.olat.ims.qti.QTIResultSet rset ");
-
-		return db.find(slct.toString());
+		String slct = "select rset from org.olat.ims.qti.QTIResultSet rset";
+		return db.getCurrentEntityManager()
+				.createQuery(slct, QTIResultSet.class)
+				.getResultList();
 	}
 	
 	public static final String getResultsFilenamePrefix(final String path, final CourseNode courseNode, final long assessmentId) {
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index 1802c4acb63..ebda4c7df1f 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -42,8 +42,6 @@ import javax.persistence.LockModeType;
 import javax.persistence.TemporalType;
 import javax.persistence.TypedQuery;
 
-import org.hibernate.type.StandardBasicTypes;
-import org.hibernate.type.Type;
 import org.olat.admin.quota.GenericQuotaEditController;
 import org.olat.admin.sysinfo.SysinfoController;
 import org.olat.admin.user.UserAdminController;
@@ -540,32 +538,29 @@ public class BaseSecurityManager implements BaseSecurity {
 	/**
 	 * @see org.olat.basesecurity.Manager#deleteSecurityGroup(org.olat.basesecurity.SecurityGroup)
 	 */
+	@Override
 	public void deleteSecurityGroup(SecurityGroup secGroup) {
 		// we do not use hibernate cascade="delete", but implement our own (to be
 		// sure to understand our code)
-		DB db = DBFactory.getInstance();
-		//FIXME: fj: Please review: Create rep entry, restart olat, delete the rep
-		// entry. previous implementation resulted in orange screen
-		// secGroup = (SecurityGroup)db.loadObject(secGroup); // so we can later
-		// delete it (hibernate needs an associated session)
-		secGroup = (SecurityGroup) db.loadObject(secGroup);
-		//o_clusterREVIEW
-		//db.reputInHibernateSessionCache(secGroup);
-
-		/*
-		 * if (!db.contains(secGroup)) { secGroup = (SecurityGroupImpl)
-		 * db.loadObject(SecurityGroupImpl.class, secGroup.getKey()); }
-		 */
+		secGroup = dbInstance.getCurrentEntityManager()
+				.getReference(SecurityGroupImpl.class, secGroup.getKey());
+
 		// 1) delete associated users (need to do it manually, hibernate knows
 		// nothing about
 		// the membership, modeled manually via many-to-one and not via set)
-		db.delete("from org.olat.basesecurity.SecurityGroupMembershipImpl as msi where msi.securityGroup.key = ?", new Object[] { secGroup
-				.getKey() }, new Type[] { StandardBasicTypes.LONG });
+		dbInstance.getCurrentEntityManager()
+			.createQuery("delete from org.olat.basesecurity.SecurityGroupMembershipImpl where securityGroup=:securityGroup")
+			.setParameter("securityGroup", secGroup)
+			.executeUpdate();
 		// 2) delete all policies
-		db.delete("from org.olat.basesecurity.PolicyImpl as poi where poi.securityGroup = ?", new Object[] { secGroup.getKey() },
-				new Type[] { StandardBasicTypes.LONG });
+
+		dbInstance.getCurrentEntityManager()
+			.createQuery("delete from org.olat.basesecurity.PolicyImpl where securityGroup=:securityGroup")
+			.setParameter("securityGroup", secGroup)
+			.executeUpdate();
 		// 3) delete security group
-		db.deleteObject(secGroup);
+		dbInstance.getCurrentEntityManager()
+			.remove(secGroup);
 	}
 
 	/**
diff --git a/src/main/java/org/olat/core/commons/persistence/DB.java b/src/main/java/org/olat/core/commons/persistence/DB.java
index 393508fc63d..ee957945d54 100644
--- a/src/main/java/org/olat/core/commons/persistence/DB.java
+++ b/src/main/java/org/olat/core/commons/persistence/DB.java
@@ -26,12 +26,9 @@
 
 package org.olat.core.commons.persistence;
 
-import java.util.List;
-
 import javax.persistence.EntityManager;
 
 import org.hibernate.stat.Statistics;
-import org.hibernate.type.Type;
 import org.infinispan.manager.EmbeddedCacheManager;
 import org.olat.core.id.Persistable;
 
@@ -63,52 +60,6 @@ public interface DB {
 	 */
 	public void deleteObject(Object object);
 
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @param value
-	 * @param type
-	 * @return List of results.
-	 */
-	public List find(String query, Object value, Type type);
-
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @param values
-	 * @param types
-	 * @return List of results.
-	 */
-	public List find(String query, Object[] values, Type[] types);
-
-	/**
-	 * Find an object.
-	 * 
-	 * @param theClass
-	 * @param key
-	 * @return Object, if any found. or null otherwise
-	 */
-	public <U> U findObject(Class<U> theClass, Long key);
-
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @return List of results.
-	 */
-	public List find(String query);
-
-	/**
-	 * Load an object.
-	 * 
-	 * @param theClass
-	 * @param key
-	 * @return Object.
-	 */
-	public <U> U loadObject(Class<U> theClass, Long key);
-
 	/**
 	 * Save an object.
 	 * 
@@ -123,26 +74,6 @@ public interface DB {
 	 */
 	public void updateObject(Object object);
 
-	/**
-	 * Deletion query.
-	 * 
-	 * @param query
-	 * @param value
-	 * @param type
-	 * @return nr of values deleted
-	 */
-	public abstract int delete(String query, Object value, Type type);
-
-	/**
-	 * Deletion query.
-	 * 
-	 * @param query
-	 * @param values
-	 * @param types
-	 * @return nr of deleted rows
-	 */
-	public int delete(String query, Object[] values, Type[] types);
-
 	/**
 	 * see DB.loadObject(Persistable persistable, boolean forceReloadFromDB)
 	 * 
diff --git a/src/main/java/org/olat/core/commons/persistence/DBImpl.java b/src/main/java/org/olat/core/commons/persistence/DBImpl.java
index ca2cb053f2f..22aa8b5bad8 100644
--- a/src/main/java/org/olat/core/commons/persistence/DBImpl.java
+++ b/src/main/java/org/olat/core/commons/persistence/DBImpl.java
@@ -30,7 +30,6 @@ import java.sql.Driver;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.util.Enumeration;
-import java.util.List;
 import java.util.Properties;
 
 import javax.persistence.Cache;
@@ -43,10 +42,8 @@ import javax.persistence.RollbackException;
 import org.hibernate.HibernateException;
 import org.hibernate.Query;
 import org.hibernate.Session;
-import org.hibernate.jpa.HibernateEntityManager;
-import org.hibernate.jpa.HibernateEntityManagerFactory;
+import org.hibernate.engine.spi.SessionFactoryImplementor;
 import org.hibernate.stat.Statistics;
-import org.hibernate.type.Type;
 import org.infinispan.manager.EmbeddedCacheManager;
 import org.olat.core.configuration.Destroyable;
 import org.olat.core.id.Persistable;
@@ -72,7 +69,7 @@ public class DBImpl implements DB, Destroyable {
 	private String dbVendor;
 	private static EntityManagerFactory emf;
 
-	private final ThreadLocal<ThreadLocalData> data = new ThreadLocal<ThreadLocalData>();
+	private final ThreadLocal<ThreadLocalData> data = new ThreadLocal<>();
 	// Max value for commit-counter, values over this limit will be logged.
 	private static int maxCommitCounter = 10;
 
@@ -276,7 +273,7 @@ public class DBImpl implements DB, Destroyable {
 	}
 	
 	private Session getSession(EntityManager em) {
-		return em.unwrap(HibernateEntityManager.class).getSession();
+		return em.unwrap(Session.class);
 	}
 	
 	private boolean unusableTrx(EntityTransaction trx) {
@@ -289,7 +286,7 @@ public class DBImpl implements DB, Destroyable {
 			getData().resetAccessCounter();
 		} else {
   			getData().incrementAccessCounter();
-    	}
+		}
     }
 
 	/**
@@ -304,10 +301,6 @@ public class DBImpl implements DB, Destroyable {
 		//  that was closed underneath by hibernate (not noticed by DBImpl).
 		//  in order to be robust for any similar situation, we check if the 
 		//  connection is open, otherwise we shouldn't worry about doing any commit/rollback anyway
-		
-
-		//commit
-		//getCurrentEntityManager();
 		EntityManager s = getData().getEntityManager(false);
 		if(s != null) {
 			EntityTransaction trx = s.getTransaction();
@@ -375,164 +368,6 @@ public class DBImpl implements DB, Destroyable {
 		}
 	}
 
-	/**
-	 * Deletion query.
-	 * 
-	 * @param query
-	 * @param value
-	 * @param type
-	 * @return nr of deleted rows
-	 */
-	@Override
-	public int delete(String query, Object value, Type type) {
-		int deleted = 0;
-		EntityManager em = getCurrentEntityManager();
-		EntityTransaction trx = em.getTransaction();
-		if (unusableTrx(trx)) { // some program bug
-			throw new DBRuntimeException("cannot delete in a transaction that is rolledback or committed " + value);
-		}
-		try {
-			//old: deleted = getSession().delete(query, value, type);
-			Session si = getSession(em);
-			Query qu = si.createQuery(query);
-			qu.setParameter(0, value, type);
-			List foundToDel = qu.list();
-			int deletionCount = foundToDel.size();
-			for (int i = 0; i < deletionCount; i++ ) {
-				si.delete( foundToDel.get(i) );
-			}
-		} catch (HibernateException e) { // we have some error
-			trx.setRollbackOnly();
-			throw new DBRuntimeException ("Could not delete object: " + value, e);
-		}
-		return deleted;
-	}
-
-	/**
-	 * Deletion query.
-	 * 
-	 * @param query
-	 * @param values
-	 * @param types
-	 * @return nr of deleted rows
-	 */
-	@Override
-	public int delete(String query, Object[] values, Type[] types) {
-		EntityManager em = getCurrentEntityManager();
-		EntityTransaction trx = em.getTransaction();
-		if (unusableTrx(trx)) { // some program bug
-			throw new DBRuntimeException("cannot delete in a transaction that is rolledback or committed " + values);
-		}
-		try {
-			//old: deleted = getSession().delete(query, values, types);
-			Session si = getSession(em);
-			Query qu = si.createQuery(query);
-			qu.setParameters(values, types);
-			List foundToDel = qu.list();
-			int deleted = foundToDel.size();
-			for (int i = 0; i < deleted; i++ ) {
-				si.delete( foundToDel.get(i) );
-			}	
-			return deleted;
-		} catch (HibernateException e) { // we have some error
-			trx.setRollbackOnly();
-			throw new DBRuntimeException ("Could not delete object: " + values, e);
-		}
-	}
-
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @param value
-	 * @param type
-	 * @return List of results.
-	 */
-	@Override
-	public List find(String query, Object value, Type type) {
-		EntityManager em = getCurrentEntityManager();
-		EntityTransaction trx = em.getTransaction();
-		try {
-			Query qu = getSession(em).createQuery(query);
-			qu.setParameter(0, value, type);
-			return qu.list();
-		} catch (HibernateException e) {
-			trx.setRollbackOnly();
-			String msg = "Find failed in transaction. Query: " +  query + " " + e;
-			getData().setError(e);
-			throw new DBRuntimeException(msg, e);
-		}
-	}
-
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @param values
-	 * @param types
-	 * @return List of results.
-	 */
-	@Override
-	public List find(String query, Object[] values, Type[] types) {
-		EntityManager em = getCurrentEntityManager();
-		try {
-			// old: li = getSession().find(query, values, types);
-			Query qu = getSession(em).createQuery(query);
-			qu.setParameters(values, types);
-			return qu.list();
-		} catch (HibernateException e) {
-			em.getTransaction().setRollbackOnly();
-			getData().setError(e);
-			throw new DBRuntimeException("Find failed in transaction. Query: " +  query + " " + e, e);
-		}
-	}
-
-	/**
-	 * Find objects based on query
-	 * 
-	 * @param query
-	 * @return List of results.
-	 */
-	@Override
-	public List find(String query) {
-		EntityManager em = getCurrentEntityManager();
-		try {
-			return em.createQuery(query).getResultList();
-		} catch (HibernateException e) {
-			em.getTransaction().setRollbackOnly();
-			getData().setError(e);
-			throw new DBRuntimeException("Find in transaction failed: " + query + " " + e, e);
-		}
-	}
-
-	/**
-	 * Find an object.
-	 * 
-	 * @param theClass
-	 * @param key
-	 * @return Object, if any found. Null, if non exist. 
-	 */
-	@Override
-	public <U> U findObject(Class<U> theClass, Long key) {
-		return getCurrentEntityManager().find(theClass, key);
-	}
-	
-	/**
-	 * Load an object.
-	 * 
-	 * @param theClass
-	 * @param key
-	 * @return Object.
-	 */
-	@Override
-	public <U> U loadObject(Class<U> theClass, Long key) {
-		try {
-			return getCurrentEntityManager().find(theClass, key);
-		} catch (Exception e) {
-			throw new DBRuntimeException("loadObject error: " + theClass + " " + key + " ", e);
-		}
-	}
-
 	/**
 	 * Save an object.
 	 * 
@@ -635,21 +470,21 @@ public class DBImpl implements DB, Destroyable {
 			if (contains(persistable)) {
 				// case b - then we can use evict and load
 				evict(em, persistable, getData());
-				return loadObject(theClass, persistable.getKey());
+				return em.find(theClass, persistable.getKey());
 			} else {
 				// case a or c - unfortunatelly we can't distinguish these two cases
 				// and session.refresh(Object) doesn't work.
 				// the only scenario that works is load/evict/load
-				Persistable attachedObj = loadObject(theClass, persistable.getKey());
+				Persistable attachedObj = em.find(theClass, persistable.getKey());
 				evict(em, attachedObj, getData());
-				return loadObject(theClass, persistable.getKey());
+				return em.find(theClass, persistable.getKey());
 			}
 		} else if (!contains(persistable)) { 
 			// forceReloadFromDB is false - hence it is OK to take it from the cache if it would be there
 			// now this object directly is not in the cache, but it's possible that the object is detached
 			// and there is an object with the same id in the hibernate cache.
 			// therefore the following loadObject can either return it from the cache or load it from the DB
-			return loadObject(theClass, persistable.getKey());
+			return em.find(theClass, persistable.getKey());
 		} else { 
 			// nothing to do, return the same object
 			return persistable;
@@ -791,8 +626,8 @@ public class DBImpl implements DB, Destroyable {
 	 */
 	@Override
 	public Statistics getStatistics() {
-		if(emf instanceof HibernateEntityManagerFactory) {
-			return ((HibernateEntityManagerFactory)emf).getSessionFactory().getStatistics();
+		if(emf instanceof SessionFactoryImplementor) {
+			return ((SessionFactoryImplementor)emf).getStatistics();
 		}
  		return null;
    }
diff --git a/src/main/java/org/olat/core/commons/services/tagging/manager/TaggingManagerImpl.java b/src/main/java/org/olat/core/commons/services/tagging/manager/TaggingManagerImpl.java
index e2e4d5dbffb..2dba56a1901 100644
--- a/src/main/java/org/olat/core/commons/services/tagging/manager/TaggingManagerImpl.java
+++ b/src/main/java/org/olat/core/commons/services/tagging/manager/TaggingManagerImpl.java
@@ -19,15 +19,14 @@
  */
 package org.olat.core.commons.services.tagging.manager;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.type.StandardBasicTypes;
-import org.hibernate.type.Type;
+import javax.persistence.Query;
+
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.DBQuery;
 import org.olat.core.commons.services.tagging.model.Tag;
@@ -246,27 +245,27 @@ public class TaggingManagerImpl extends BasicManager implements TaggingManager {
 
 	@Override
 	public void deleteTags(OLATResourceable ores, String subPath, String businessPath) {
-		List<Object> values = new ArrayList<Object>();
-		List<Type> types = new ArrayList<Type>();
 		StringBuilder sb = new StringBuilder();
-		sb.append("from ").append(TagImpl.class.getName()).append(" where resId=? and resName=?");
-		values.add(ores.getResourceableId());
-		types.add(StandardBasicTypes.LONG);
-		values.add(ores.getResourceableTypeName());
-		types.add(StandardBasicTypes.STRING);
+		sb.append("delete from ").append(TagImpl.class.getName()).append(" where resId=:resId and resName=:resName");
+		if(subPath != null) {
+			sb.append(" and resSubPath=:subPath");
+		}
+		if(businessPath != null) {
+			sb.append(" and businessPath=:businessPath");
+		}
+		
+		Query query = dbInstance.getCurrentEntityManager()
+			.createQuery(sb.toString())
+			.setParameter("resId", ores.getResourceableId())
+			.setParameter("resName", ores.getResourceableTypeName());
 		if(subPath != null) {
-			sb.append(" and resSubPath=?");
-			values.add(subPath);
-			types.add(StandardBasicTypes.STRING);
+			query.setParameter("subPath", subPath);
 		}
 		if(businessPath != null) {
-			sb.append(" and businessPath=?");
-			values.add(businessPath);
-			types.add(StandardBasicTypes.STRING);
+			query.setParameter("businessPath", businessPath);
 		}
 		
-		int tagsDeleted = dbInstance.delete(sb.toString(), values.toArray(new Object[values.size()]),
-				types.toArray(new Type[types.size()]));
+		int tagsDeleted = query.executeUpdate();
 		logAudit("Deleted " + tagsDeleted + " tags of resource: " + ores.getResourceableTypeName() + " :: " + ores.getResourceableId());
 	}
 
diff --git a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
index fff5639dc5a..5859dd88968 100644
--- a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
+++ b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java
@@ -26,8 +26,6 @@ package org.olat.core.util.coordinate;
 
 import java.io.File;
 
-import org.hibernate.type.StandardBasicTypes;
-import org.hibernate.type.Type;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.id.Identity;
@@ -125,9 +123,13 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD
 	 */
 	@Override
 	public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) {		
-		String query = "from v in class org.olat.properties.Property where v.category = ? and v.longValue = ?";
-		DBFactory.getInstance().delete(query, new Object[] { CATEGORY_PERSISTENTLOCK, identity.getKey() },
-				new Type[] { StandardBasicTypes.STRING, StandardBasicTypes.LONG });
+		String query = "delete from org.olat.properties.Property where category=:category and longValue=:val";
+		
+		DBFactory.getInstance().getCurrentEntityManager()
+			.createQuery(query)
+			.setParameter("category", CATEGORY_PERSISTENTLOCK)
+			.setParameter("val", identity.getKey())
+			.executeUpdate();
 		log.debug("All db-persisting-locks deleted for identity=" + identity);
 	}
 
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
index 7b2274f201e..37f275e82d2 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/service/ProjectBrokerManagerImpl.java
@@ -34,7 +34,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.StringTokenizer;
 
-import org.hibernate.type.StandardBasicTypes;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.SecurityGroup;
@@ -162,7 +161,7 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 	
 	@Override
 	public boolean existsProject(Long projectKey) {
-		return dbInstance.findObject(ProjectImpl.class, projectKey) != null;
+		return dbInstance. getCurrentEntityManager().find(ProjectImpl.class, projectKey) != null;
 	}
 
 	@Override
@@ -536,8 +535,9 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 		return projectBroker;
 	}
 
+	@Override
 	public ProjectBroker getProjectBroker(Long projectBrokerId) {
-		return dbInstance.loadObject(ProjectBrokerImpl.class, projectBrokerId);
+		return dbInstance.getCurrentEntityManager().find(ProjectBrokerImpl.class, projectBrokerId);
 	}
 
 	private boolean isEnrollmentDateOk(Project project, ProjectBrokerModuleConfiguration moduleConfig) {
@@ -568,6 +568,7 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 	 * @param projectList
 	 * @return
 	 */
+	@Override
 	public boolean isParticipantInAnyProject(Identity identity, List<Project> projectList) {
 		for (Iterator<Project> iterator = projectList.iterator(); iterator.hasNext();) {
 			Project project = iterator.next();
@@ -578,12 +579,15 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 		return false;
 	}
 
-	@SuppressWarnings("unchecked")
+	@Override
 	public List<Project> getProjectsWith(BusinessGroup group) {
-		List<Project> projectList = dbInstance.find(
-				"select project from org.olat.course.nodes.projectbroker.datamodel.ProjectImpl as project" +
-				" where project.projectGroup.key = ?", group.getKey(),	StandardBasicTypes.LONG);
-		return projectList;
+		StringBuilder sb = new StringBuilder();
+		sb.append("select project from ").append(ProjectImpl.class.getName()).append(" as project")
+		  .append(" where project.projectGroup.key=:groupKey");
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Project.class)
+				.setParameter("groupKey", group.getKey())
+				.getResultList();
 	}
 
 	@Override
@@ -591,6 +595,7 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 		final Long projectBrokerId = project.getProjectBroker().getKey();
 		OLATResourceable projectBrokerOres = OresHelper.createOLATResourceableInstance(this.getClass(),projectBrokerId);
 		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync( projectBrokerOres, new SyncerExecutor() {
+			@Override
 			public void execute() {
 				// For cluster-safe : reload project object here another node might have changed this in the meantime
 				Project reloadedProject = (Project) dbInstance.loadObject(project, true);		
@@ -599,13 +604,13 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 			}
 		});	
 	}
-	
+
+	@Override
 	public Long getProjectBrokerId(CoursePropertyManager cpm, CourseNode courseNode) {
   	Property projectBrokerKeyProperty = cpm.findCourseNodeProperty(courseNode, null, null, ProjectBrokerCourseNode.CONF_PROJECTBROKER_KEY);
 		// Check if forum-property exist
 		if (projectBrokerKeyProperty != null) {
-		  Long projectBrokerId = projectBrokerKeyProperty.getLongValue();
-		  return projectBrokerId;
+		  return projectBrokerKeyProperty.getLongValue();
 		}
 		return null;
 	}
@@ -642,7 +647,7 @@ public class ProjectBrokerManagerImpl extends BasicManager implements ProjectBro
 
 	@Override
 	public Project getProject(Long resourceableId) {
-		return dbInstance.findObject(ProjectImpl.class, resourceableId);
+		return dbInstance.getCurrentEntityManager().find(ProjectImpl.class, resourceableId);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/portfolio/manager/EPStructureManager.java b/src/main/java/org/olat/portfolio/manager/EPStructureManager.java
index 6c8067aed97..378cefc4063 100755
--- a/src/main/java/org/olat/portfolio/manager/EPStructureManager.java
+++ b/src/main/java/org/olat/portfolio/manager/EPStructureManager.java
@@ -1605,7 +1605,8 @@ public class EPStructureManager {
 	public PortfolioStructure reloadPortfolioStructure(PortfolioStructure structure) {
 		if (structure == null) throw new NullPointerException();
 		try {
-			return dbInstance.loadObject(EPStructureElement.class, structure.getKey());
+			return dbInstance.getCurrentEntityManager()
+					.find(EPStructureElement.class, structure.getKey());
 		} catch (ObjectNotFoundException e) {
 			return null;
 		}
diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java
index 0b0b00a1e13..9c7c002e7f1 100644
--- a/src/main/java/org/olat/user/UserManagerImpl.java
+++ b/src/main/java/org/olat/user/UserManagerImpl.java
@@ -40,7 +40,6 @@ import org.olat.basesecurity.IdentityNames;
 import org.olat.basesecurity.IdentityRef;
 import org.olat.basesecurity.IdentityShort;
 import org.olat.core.commons.persistence.DB;
-import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
@@ -262,7 +261,7 @@ public class UserManagerImpl extends UserManager {
 	
 	@Override
 	public User loadUserByKey(Long key) {
-		return DBFactory.getInstance().loadObject(UserImpl.class, key);
+		return dbInstance.getCurrentEntityManager().find(UserImpl.class, key);
 		// User not loaded yet (lazy initialization). Need to access
 		// a field first to really load user from database.
 	}
diff --git a/src/test/java/de/bps/onyx/plugin/OnyxResultManagerTest.java b/src/test/java/de/bps/onyx/plugin/OnyxResultManagerTest.java
new file mode 100644
index 00000000000..23e107dd3ea
--- /dev/null
+++ b/src/test/java/de/bps/onyx/plugin/OnyxResultManagerTest.java
@@ -0,0 +1,106 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package de.bps.onyx.plugin;
+
+import static org.olat.modules.iq.IQTestHelper.createRepository;
+import static org.olat.modules.iq.IQTestHelper.createSet;
+import static org.olat.modules.iq.IQTestHelper.modDate;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
+import org.olat.core.util.CodeHelper;
+import org.olat.course.nodes.IQTESTCourseNode;
+import org.olat.course.nodes.QTICourseNode;
+import org.olat.ims.qti.QTIResultSet;
+import org.olat.repository.RepositoryEntry;
+import org.olat.test.JunitTestHelper;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 11 janv. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class OnyxResultManagerTest extends OlatTestCase {
+	
+	@Autowired
+	private DB dbInstance;
+	
+	@Test
+	public void findResultSets() {
+		List<QTIResultSet> resultSets = OnyxResultManager.findResultSets();
+		Assert.assertNotNull(resultSets);
+	}
+	
+	@Test
+	public void isLastTestTry() {
+		RepositoryEntry re = createRepository();
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("qti-result-mgr-1");
+		long assessmentId = CodeHelper.getForeverUniqueID();
+		String resSubPath = "qtiResult35";
+		QTIResultSet set = createSet(1.0f, assessmentId, id, re, resSubPath, modDate(3, 8, 5), modDate(3, 8, 20));
+		dbInstance.commit();
+		Assert.assertNotNull(set);
+		
+		//check
+		Boolean last = OnyxResultManager.isLastTestTry(set);
+		Assert.assertTrue(last.booleanValue());
+	}
+	
+	@Test
+	public void getSuspendedQTIResultSet() {
+		RepositoryEntry re = createRepository();
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("qti-result-mgr-2");
+		long assessmentId = CodeHelper.getForeverUniqueID();
+		String resSubPath = "qtiResult36";
+		QTIResultSet set = createSet(1.0f, assessmentId, id, re, resSubPath, modDate(3, 8, 5), modDate(3, 8, 20));
+		dbInstance.commit();
+		Assert.assertNotNull(set);
+		
+		// fake the course node
+		QTICourseNode courseNode = new IQTESTCourseNode();
+		courseNode.setIdent(resSubPath);
+		//check
+		List<Long> suspendedResults = OnyxResultManager.getSuspendedQTIResultSet(id, courseNode);
+		Assert.assertNotNull(suspendedResults);
+	}
+	
+	@Test
+	public void getResultSetByAssessmentId() {
+		RepositoryEntry re = createRepository();
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("qti-result-mgr-3");
+		long assessmentId = CodeHelper.getForeverUniqueID();
+		String resSubPath = "qtiResult37";
+		QTIResultSet set = createSet(1.0f, assessmentId, id, re, resSubPath, modDate(3, 8, 5), modDate(3, 8, 20));
+		dbInstance.commit();
+		Assert.assertNotNull(set);
+
+		//check
+		List<Long> results = OnyxResultManager.getResultSetByAssessmentId(assessmentId);
+		Assert.assertNotNull(results);
+		Assert.assertTrue(results.contains(set.getKey()));
+	}
+}
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
index fce34a0899c..238ad62da40 100644
--- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
@@ -1016,4 +1016,27 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertNotNull(securityManager.findAuthenticationByAuthusername(email, "del-mail"));
 	}
 	
+	@Test
+	public void deleteSecurityGroup() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("test-del-2");
+		SecurityGroup secGroup = securityManager.createAndPersistSecurityGroup();
+		securityManager.addIdentityToSecurityGroup(id, secGroup);
+		OLATResource resource = JunitTestHelper.createRandomResource();
+		Policy policy = securityManager.createAndPersistPolicy(secGroup, "test.right11", resource);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(policy);
+		
+		//delete the security group (and membership, and policies)
+		securityManager.deleteSecurityGroup(secGroup);
+		dbInstance.commit();
+		
+		//checks
+		List<Policy> deletedPolicies = securityManager.getPoliciesOfResource(resource, secGroup);
+		Assert.assertNotNull(deletedPolicies);
+		Assert.assertTrue(deletedPolicies.isEmpty());
+		
+		boolean membership = securityManager.isIdentityInSecurityGroup(id, secGroup);
+		Assert.assertFalse(membership);
+	}
+	
 }
diff --git a/src/test/java/org/olat/core/commons/persistence/DBTest.java b/src/test/java/org/olat/core/commons/persistence/DBTest.java
index 19ab9c1649c..03195235a0d 100644
--- a/src/test/java/org/olat/core/commons/persistence/DBTest.java
+++ b/src/test/java/org/olat/core/commons/persistence/DBTest.java
@@ -303,13 +303,13 @@ public class DBTest extends OlatTestCase {
 		// forget session cache etc.
 		dbInstance.closeSession();
 		// 2. try to find object
-		Object testObject = dbInstance.findObject(Property.class, propertyKey);
+		Object testObject = dbInstance.getCurrentEntityManager().find(Property.class, propertyKey);
 		assertNotNull(testObject);
 		// 3. Delete object
 		PropertyManager.getInstance().deleteProperty( (Property)testObject );
 		dbInstance.closeSession();
 		// 4. try again to find object, now no-one should be found, must return null
-		testObject = DBFactory.getInstance().findObject(Property.class, propertyKey);
+		testObject = DBFactory.getInstance().getCurrentEntityManager().find(Property.class, propertyKey);
 		assertNull(testObject);
 	}
 	
diff --git a/src/test/java/org/olat/core/util/coordinate/DBPersistentLockManagerTest.java b/src/test/java/org/olat/core/util/coordinate/DBPersistentLockManagerTest.java
new file mode 100644
index 00000000000..ed8f4a7b792
--- /dev/null
+++ b/src/test/java/org/olat/core/util/coordinate/DBPersistentLockManagerTest.java
@@ -0,0 +1,103 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.core.util.coordinate;
+
+import java.util.UUID;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
+import org.olat.core.id.OLATResourceable;
+import org.olat.core.util.resource.OresHelper;
+import org.olat.test.JunitTestHelper;
+import org.olat.test.OlatTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 12 janv. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class DBPersistentLockManagerTest extends OlatTestCase {
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private DBPersistentLockManager lockManager;
+	
+	@Test
+	public void aquirePersistentLock() {
+		String type = UUID.randomUUID().toString();
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance(type, 25l);
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("lock-1");
+		String locksubkey = UUID.randomUUID().toString();
+		
+		// acquire lock
+		LockResult lock = lockManager.aquirePersistentLock(ores, owner, locksubkey);
+		dbInstance.commit();
+		//check
+		Assert.assertNotNull(lock);
+		Assert.assertEquals(owner, lock.getOwner());
+		Assert.assertTrue(lock.isSuccess());
+	}
+	
+	@Test
+	public void releasePersistentLock() {
+		String type = UUID.randomUUID().toString();
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance(type, 25l);
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("lock-1");
+		String locksubkey = UUID.randomUUID().toString();
+		
+		// acquire lock
+		LockResult lock = lockManager.aquirePersistentLock(ores, owner, locksubkey);
+		dbInstance.commit();
+		Assert.assertTrue(lock.isSuccess());
+		
+		//release
+		lockManager.releasePersistentLock(lock);
+		dbInstance.commit();
+	}
+	
+	@Test
+	public void deleteUserData() {
+		String type = UUID.randomUUID().toString();
+		OLATResourceable ores = OresHelper.createOLATResourceableInstance(type, 25l);
+		Identity owner = JunitTestHelper.createAndPersistIdentityAsRndUser("lock-1");
+		Identity nextIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("lock-2");
+		String locksubkey = UUID.randomUUID().toString();
+		
+		// acquire lock
+		LockResult lock = lockManager.aquirePersistentLock(ores, owner, locksubkey);
+		dbInstance.commit();
+		Assert.assertTrue(lock.isSuccess());
+		
+		//delete the owner
+		lockManager.deleteUserData(owner, "", null);
+		dbInstance.commit();
+		
+		//next can acquire the lock
+		LockResult nextLock = lockManager.aquirePersistentLock(ores, nextIdentity, locksubkey);
+		dbInstance.commit();
+		Assert.assertTrue(nextLock.isSuccess());
+	}
+
+}
diff --git a/src/test/java/org/olat/course/nodes/projectbroker/ProjectBrokerManagerTest.java b/src/test/java/org/olat/course/nodes/projectbroker/ProjectBrokerManagerTest.java
index 3406431d681..a81ade32838 100644
--- a/src/test/java/org/olat/course/nodes/projectbroker/ProjectBrokerManagerTest.java
+++ b/src/test/java/org/olat/course/nodes/projectbroker/ProjectBrokerManagerTest.java
@@ -46,9 +46,12 @@ import org.junit.Before;
 import org.junit.Test;
 import org.olat.basesecurity.SecurityGroupImpl;
 import org.olat.core.CoreSpringFactory;
+import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
 import org.olat.core.util.Util;
 import org.olat.course.nodes.projectbroker.datamodel.Project;
 import org.olat.course.nodes.projectbroker.datamodel.ProjectBroker;
@@ -71,49 +74,40 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 
 public class ProjectBrokerManagerTest extends OlatTestCase {
+	private static final OLog log = Tracing.createLoggerFor(ProjectBrokerManagerTest.class);
 
-	private static Identity id1 = null;
-	private static Identity id2 = null;
-	private static Long resourceableId = null;
+	private static Identity id1;
+	private static Identity id2;
+	private static Long resourceableId;
 	
+	@Autowired
+	private DB dbInstance;
 	@Autowired
 	private ProjectGroupManager projectGroupManager;
 	@Autowired
 	private ProjectBrokerManager projectBrokerManager;
-	
 
-	/**
-	 * @see junit.framework.TestCase#setUp()
-	 */
 	@Before
 	public void setup() throws Exception {
-		System.out.println("ProjectBrokerManagerTest.setUp start...");
 		try {
-			id1 = JunitTestHelper.createAndPersistIdentityAsUser("project-id1-" + UUID.randomUUID().toString());
-			id2 = JunitTestHelper.createAndPersistIdentityAsUser("project-id2-" + UUID.randomUUID().toString());
+			id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("project-id1");
+			id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("project-id2");
 
 			if (resourceableId == null) {
-				Identity author = JunitTestHelper.createAndPersistIdentityAsUser("project-auth-" + UUID.randomUUID().toString());
+				Identity author = JunitTestHelper.createAndPersistIdentityAsUser("project-auth-" + UUID.randomUUID());
 				RepositoryEntry repositoryEntry = JunitTestHelper.deployDemoCourse(author);
 				resourceableId = repositoryEntry.getOlatResource().getResourceableId();
-				System.out.println("Demo course imported - resourceableId: " + resourceableId);
+				log.info("Demo course imported - resourceableId: " + resourceableId);
 			}
 			DBFactory.getInstance().closeSession();
-			
-			System.out.println("ProjectBrokerManagerTest.setUp finished");
 		} catch (Exception e) {
-			System.out.println("ProjectBrokerManagerTest.setUp Exception=" + e.getMessage());
-			e.printStackTrace();
+			log.error("", e);
 			fail(e.getMessage());
 		}
 	}
 
-
-	/**
-	 * 
-	 */
-	@Test public void testCreateListDeleteProjects() throws Exception {
-		System.out.println("testCreateListDeleteProjects: start...");
+	@Test
+	public void testCreateListDeleteProjects() throws Exception {
 		// create ProjectBroker A + B
 		ProjectBroker projectBrokerA = projectBrokerManager.createAndSaveProjectBroker();
 		Long idProjectBrokerA = projectBrokerA.getKey();
@@ -125,8 +119,8 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		// add project to ProjectBroker B
 		createProject("thema B1", id1, idProjectBrokerB, resourceableId );
 		createProject("thema B2", id1, idProjectBrokerB, resourceableId );
+		dbInstance.commitAndCloseSession();
 		
-		DBFactory.getInstance().closeSession();
 		// get project list and check content
 		List<Project> projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA);
 		assertEquals("Wrong projectList.size for project-broker A",2, projectListA.size());
@@ -152,11 +146,11 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		// delete project 
 		long candiadteGroupKey = projectListA.get(0).getCandidateGroup().getKey();
 		long projectGroupKey = projectListA.get(0).getProjectGroup().getKey();
-		assertNotNull("CandidateGroup does not exist before delete project", DBFactory.getInstance().findObject(SecurityGroupImpl.class, candiadteGroupKey));
-		assertNotNull("ProjectGroup does not exist before delete project", DBFactory.getInstance().findObject(BusinessGroupImpl.class, projectGroupKey));
+		assertNotNull("CandidateGroup does not exist before delete project", dbInstance.getCurrentEntityManager().find(SecurityGroupImpl.class, candiadteGroupKey));
+		assertNotNull("ProjectGroup does not exist before delete project", dbInstance.getCurrentEntityManager().find(BusinessGroupImpl.class, projectGroupKey));
 		projectBrokerManager.deleteProject(projectListA.get(0), true, null, null);
-		assertNull("CandidateGroup still exists after delete project", DBFactory.getInstance().findObject(SecurityGroupImpl.class, candiadteGroupKey));
-		assertNull("ProjectGroup still exists after delete project", DBFactory.getInstance().findObject(BusinessGroupImpl.class, projectGroupKey));
+		assertNull("CandidateGroup still exists after delete project", dbInstance.getCurrentEntityManager().find(SecurityGroupImpl.class, candiadteGroupKey));
+		assertNull("ProjectGroup still exists after delete project", dbInstance.getCurrentEntityManager().find(BusinessGroupImpl.class, projectGroupKey));
 
 		// get project list and check content
 		projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA);
@@ -175,58 +169,57 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		projectBrokerManager.deleteProject(projectListA.get(0), true, null, null);
 		projectListA = projectBrokerManager.getProjectListBy(idProjectBrokerA);
 		projectListB = projectBrokerManager.getProjectListBy(idProjectBrokerB);
-		System.out.println("testCreateListDeleteProjects: projectListA=" + projectListA);
+		log.info("testCreateListDeleteProjects: projectListA=" + projectListA);
 		assertEquals("Wrong projectList.size for project-broker A after delete all thema",0, projectListA.size());
 		assertEquals("Wrong projectList.size for project-broker B after delete all thema",1, projectListB.size());
-		// cleanup
-		System.out.println("testCreateListDeleteProjects: done");
 	}
 
-	@Test public void testPerformanceGetProjectList() throws Exception {
-		System.out.println("testPerformanceGetProjectList: start...");
+	@Test
+	public void testPerformanceGetProjectList() throws Exception {
 		int FIRST_ITERATION = 10;
 		int SECOND_ITERATION = 90;
 		int THIRD_ITERATION = 400;
 		// create ProjectBroker C
 		ProjectBroker projectBrokerC = projectBrokerManager.createAndSaveProjectBroker();
 		Long idProjectBrokerC = projectBrokerC.getKey();
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		for (int i = 0; i < FIRST_ITERATION; i++) {
 			createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId );		
 		}
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
+		
 		long startTime = System.currentTimeMillis();		
 		List<Project> projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC);
 		long endTime = System.currentTimeMillis();
 		assertEquals("Wrong projectList.size for project-broker C after first iteration",FIRST_ITERATION, projectListC.size());
 		long duration = endTime - startTime; 
-		System.out.println("getProjectListBy takes " + duration + "ms with " + FIRST_ITERATION + " projects");
+		log.info("getProjectListBy takes " + duration + "ms with " + FIRST_ITERATION + " projects");
 
 		for (int i = 0; i < SECOND_ITERATION; i++) {
 			createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId );			
 		}
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
+		
 		startTime = System.currentTimeMillis();
 		projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC);
 		endTime = System.currentTimeMillis();
 		int numberOfProjects = FIRST_ITERATION + SECOND_ITERATION;
 		assertEquals("Wrong projectList.size for project-broker C", numberOfProjects, projectListC.size());
 		duration = endTime - startTime; 
-		System.out.println("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects");
+		log.info("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects");
 
 		for (int i = 0; i < THIRD_ITERATION; i++) {
 			createProject("thema C1_" + i, id1, idProjectBrokerC, resourceableId );			
 		}
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
+		
 		startTime = System.currentTimeMillis();
 		projectListC = projectBrokerManager.getProjectListBy(idProjectBrokerC);
 		endTime = System.currentTimeMillis();
 		numberOfProjects = FIRST_ITERATION + SECOND_ITERATION + THIRD_ITERATION;
 		assertEquals("Wrong projectList.size for project-broker C", numberOfProjects, projectListC.size());
 		duration = endTime - startTime; 
-		System.out.println("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects");
-		// cleanup
-		System.out.println("testPerformance: done");
+		log.info("getProjectListBy takes " + duration + "ms with " + numberOfProjects + " projects");
 	}
 
 	@Test
@@ -256,11 +249,11 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		}
 		long endTime = System.currentTimeMillis();
 		long duration = endTime - startTime; 
-		System.out.println("tableModel.getValueAt(row, col) for " + PAGE_SIZE + "elements (of " + ITERATION + ") takes " + duration + "ms with " + ITERATION + " projects");
-		// cleanup
+		log.info("tableModel.getValueAt(row, col) for " + PAGE_SIZE + "elements (of " + ITERATION + ") takes " + duration + "ms with " + ITERATION + " projects");
 	}
 
-	@Test public void testIsProjectManager() throws Exception {
+	@Test
+	public void testIsProjectManager() throws Exception {
 		ProjectBroker projectBrokerD = projectBrokerManager.createAndSaveProjectBroker();
 		Long idProjectBrokerD = projectBrokerD.getKey();
 		
@@ -277,21 +270,37 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		// check no project leader anymore
 		assertFalse("Can not be project leader of project A",projectGroupManager.isProjectManager(id1, testProjectA));
 		assertFalse("Can not be project leader of project B",projectGroupManager.isProjectManager(id1, testProjectB));
-		// cleanup
 	}
 
-	@Test public void testExistsProject() throws Exception {
+	@Test
+	public void testExistsProject() throws Exception {
 		// 1. test project does not exists
 		assertFalse("Wrong return value true, project does not exist", projectBrokerManager.existsProject(39927492743L));
 		// 2. test project exists
 		ProjectBroker projectBrokerD = projectBrokerManager.createAndSaveProjectBroker();
 		Long idProjectBrokerD = projectBrokerD.getKey();
 		Project testProjectA = createProject("thema existsProject-Test", id1, idProjectBrokerD, resourceableId );
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		assertTrue("Wrong return value false, project exists", projectBrokerManager.existsProject(testProjectA.getKey()));		
 	}
+	
+	@Test
+	public void getProjectsWith() {
+		ProjectBroker projectBroker = projectBrokerManager.createAndSaveProjectBroker();
+		BusinessGroup projectGroup = projectGroupManager
+				.createProjectGroupFor(projectBroker.getKey(), id1, "getProjectsWith", "getProjectsWithGroupDescription", resourceableId);
+		Project project = projectBrokerManager
+				.createAndSaveProjectFor("getProjectsWith", "getProjectsWith", projectBroker.getKey(), projectGroup);
+		dbInstance.commitAndCloseSession();
+		
+		List<Project> projects = projectBrokerManager.getProjectsWith(projectGroup);
+		Assert.assertNotNull(projects);
+		Assert.assertEquals(1, projects.size());
+		Assert.assertEquals(project, projects.get(0));
+	}
 
-	@Test public void testUpdateProject() throws Exception {
+	@Test
+	public void testUpdateProject() throws Exception {
 		ProjectBroker projectBroker = projectBrokerManager.createAndSaveProjectBroker();
 		Long idProjectBroker = projectBroker.getKey();
 		Project testProjectA = createProject("updateTest", id1, idProjectBroker, resourceableId );
@@ -305,9 +314,9 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		String updateState = "state update1";
 		testProjectA.setState(updateState);
 		projectBrokerManager.updateProject(testProjectA);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
 		// testProjectA is now a detached-object again
-		Project reloadedProject = (Project) DBFactory.getInstance().loadObject(testProjectA, true);
+		Project reloadedProject = (Project) dbInstance.loadObject(testProjectA, true);
 		assertEquals("Wrong updated title 1",updateTitle,reloadedProject.getTitle());
 		// Update 2
 		String updateTitle2 = "thema updateProject-Test update2";
@@ -323,7 +332,8 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		String updateCustomField1 = "CustomField1";
 		testProjectA.setCustomFieldValue(1, updateCustomField1);
 		projectBrokerManager.updateProject(testProjectA);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
+		
 		// Update 3
 		Calendar cal = Calendar.getInstance();
 		cal.clear();
@@ -336,7 +346,8 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		testProjectA.setProjectEvent(projectEventEnroll);
 		ProjectEvent projectEventHandout = new ProjectEvent(Project.EventType.HANDOUT_EVENT, startDate, endDate);
 		testProjectA.setProjectEvent(projectEventHandout);
-		DBFactory.getInstance().closeSession();
+		dbInstance.closeSession();
+		
 		reloadedProject = (Project) DBFactory.getInstance().loadObject(testProjectA, true);
 		assertEquals("Wrong updated title 2",updateTitle2,reloadedProject.getTitle());
 		assertEquals("Wrong description",updateDescription,reloadedProject.getDescription());
@@ -353,14 +364,11 @@ public class ProjectBrokerManagerTest extends OlatTestCase {
 		assertEquals("Wrong event Type (Enroll)",Project.EventType.ENROLLMENT_EVENT,reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getEventType());
 		assertEquals("Wrong event start-date (Enroll)",startDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getStartDate().getTime());
 		assertEquals("Wrong event end-date (Enroll)",endDate.getTime(),reloadedProject.getProjectEvent(Project.EventType.ENROLLMENT_EVENT).getEndDate().getTime());
-
 	}
 	
 	private Project createProject(String projectName, Identity creator, Long projectBrokerId, Long courseId) {
 		BusinessGroup projectGroup = projectGroupManager.createProjectGroupFor(projectBrokerId, creator, projectName + "_Group", projectName + "GroupDescription", courseId);
-		Project project = projectBrokerManager.createAndSaveProjectFor(projectName + "title", projectName + "description1", projectBrokerId, projectGroup);
-		return project;
+		return projectBrokerManager.createAndSaveProjectFor(projectName + "title", projectName + "description1", projectBrokerId, projectGroup);
 	}
-
 }
 
diff --git a/src/test/java/org/olat/resource/accesscontrol/ACOfferManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACOfferManagerTest.java
index 9587a02360d..8e681aae63f 100644
--- a/src/test/java/org/olat/resource/accesscontrol/ACOfferManagerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/ACOfferManagerTest.java
@@ -195,7 +195,7 @@ public class ACOfferManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 
 		//delete the resource
-		testOres = dbInstance.loadObject(OLATResourceImpl.class, testOres.getKey());
+		testOres = dbInstance.getCurrentEntityManager().find(OLATResourceImpl.class, testOres.getKey());
 		dbInstance.deleteObject(testOres);
 
 		dbInstance.commitAndCloseSession();
@@ -276,7 +276,7 @@ public class ACOfferManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 
 		//delete resource of offer 2
-		testOres2 = dbInstance.loadObject(OLATResourceImpl.class, testOres2.getKey());
+		testOres2 = dbInstance.getCurrentEntityManager().find(OLATResourceImpl.class, testOres2.getKey());
 		dbInstance.deleteObject(testOres2);
 
 		//filter by resources
diff --git a/src/test/java/org/olat/resource/accesscontrol/ACOrderManagerTest.java b/src/test/java/org/olat/resource/accesscontrol/ACOrderManagerTest.java
index c18bddb2c5a..87f09f8bcc6 100644
--- a/src/test/java/org/olat/resource/accesscontrol/ACOrderManagerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/ACOrderManagerTest.java
@@ -500,7 +500,7 @@ public class ACOrderManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 
 		//delete the resource
-		randomOres1 = dbInstance.loadObject(OLATResourceImpl.class, randomOres1.getKey());
+		randomOres1 = dbInstance.getCurrentEntityManager().find(OLATResourceImpl.class, randomOres1.getKey());
 		dbInstance.deleteObject(randomOres1);
 		
 		dbInstance.commitAndCloseSession();
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 02610020883..f7f42e3e24b 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -60,6 +60,7 @@ import org.junit.runners.Suite;
 	org.olat.core.util.filter.impl.XMLValidEntityFilterTest.class,
 	org.olat.core.helpers.SettingsTest.class,
 	org.olat.core.util.coordinate.LockEntryTest.class,
+	org.olat.core.util.coordinate.DBPersistentLockManagerTest.class,
 	org.olat.core.util.StringHelperTest.class,
 	org.olat.core.util.FileUtilsTest.class,
 	org.olat.core.util.FileNameSuffixFilterTest.class,
@@ -320,6 +321,7 @@ import org.junit.runners.Suite;
 	org.olat.restapi.DocumentPoolModuleWebServiceTest.class,
 	org.olat.restapi.TaxonomyWebServiceTest.class,
 	de.bps.onyx.plugin.OnyxModuleTest.class,
+	de.bps.onyx.plugin.OnyxResultManagerTest.class,
 	de.bps.olat.portal.institution.InstitutionPortletTest.class,
 	org.olat.group.manager.BusinessGroupImportExportXStreamTest.class,
 	org.olat.group.test.BusinessGroupImportExportTest.class,
-- 
GitLab