Skip to content

Commit

Permalink
MCR-2647 hibernate 6 jpa 3.1 (#1587)
Browse files Browse the repository at this point in the history
* update to hibernate 6.3.1
* update jql queries and mapping
* maintain database schema with small API changes
* update persistence.xml to JPA 3.1
* deprecate MCRCategoryID.getID()
* update H2
  • Loading branch information
yagee-de committed Nov 3, 2023
1 parent d797e1a commit 423c8a8
Show file tree
Hide file tree
Showing 71 changed files with 303 additions and 324 deletions.
Expand Up @@ -20,6 +20,7 @@

import java.util.Date;

import jakarta.persistence.Basic;
import org.mycore.backend.jpa.MCRObjectIDConverter;
import org.mycore.datamodel.metadata.MCRObjectID;

Expand Down Expand Up @@ -127,6 +128,7 @@ public MCRAccessKey(final String secret, final String type) {
length = MCRObjectID.MAX_LENGTH,
nullable = false)
@Convert(converter = MCRObjectIDConverter.class)
@Basic
public MCRObjectID getObjectId() {
return objectId;
}
Expand Down
14 changes: 7 additions & 7 deletions mycore-acl/src/test/resources/META-INF/persistence.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="UTF-8" ?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd"
version="3.1">
<persistence-unit name="mycore-acl" transaction-type="RESOURCE_LOCAL">
<!-- http://stackoverflow.com/questions/15026302/multiple-jars-single-persistence-unit-solution -->
<mapping-file>META-INF/mycore-base-mappings.xml</mapping-file>
<mapping-file>META-INF/mycore-user2-mappings.xml</mapping-file>
<mapping-file>META-INF/mycore-acl-mappings.xml</mapping-file>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:mycore" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="jakarta.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
<property name="jakarta.persistence.jdbc.url" value="jdbc:hsqldb:mem:mycore" />
<property name="jakarta.persistence.jdbc.user" value="sa" />
<property name="jakarta.persistence.jdbc.password" value="" />
<property name="hibernate.cache.use_second_level_cache" value="false" />
<property name="hibernate.jdbc.batch_size" value="0" />
<property name="hibernate.show_sql" value="false" />
Expand Down
13 changes: 10 additions & 3 deletions mycore-base/pom.xml
Expand Up @@ -135,6 +135,13 @@
</properties>
<trimStackTrace>false</trimStackTrace>
</configuration>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>3.1.2</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
Expand Down Expand Up @@ -347,8 +354,8 @@
<artifactId>hamcrest-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core-jakarta</artifactId>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
Expand Down Expand Up @@ -451,7 +458,7 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-hikaricp</artifactId>
<scope>test</scope>
</dependency>
Expand Down
Expand Up @@ -60,9 +60,9 @@ public Optional<MCRStringFact> computeFact(MCRFactsHolder facts) {
Optional<MCRObject> optMcrObj = idc.get().getObject();
if (optMcrObj.isPresent()) {
MCRCategoryID state = optMcrObj.get().getService().getState();
if (getTerm().equals(state.getID())) {
if (getTerm().equals(state.getId())) {
MCRStringFact fact = new MCRStringFact(getFactName(), getTerm());
fact.setValue(state.getID());
fact.setValue(state.getId());
facts.add(fact);
return Optional.of(fact);
}
Expand Down
Expand Up @@ -112,11 +112,11 @@ private static MCRLINKHREFPK getKey(String from, String to, String type) {
public final void delete(String from, String to, String type) {
from = checkAttributeIsNotEmpty(from, "from");
StringBuilder sb = new StringBuilder();
sb.append("from ").append(classname).append(" where MCRFROM = '").append(from).append('\'');
sb.append("from ").append(classname).append(" where key.mcrfrom = '").append(from).append('\'');
MCRUtils.filterTrimmedNotEmpty(to)
.ifPresent(trimmedTo -> sb.append(" and MCRTO = '").append(trimmedTo).append('\''));
.ifPresent(trimmedTo -> sb.append(" and key.mcrto = '").append(trimmedTo).append('\''));
MCRUtils.filterTrimmedNotEmpty(type)
.ifPresent(trimmedType -> sb.append(" and MCRTYPE = '").append(trimmedType).append('\''));
.ifPresent(trimmedType -> sb.append(" and key.mcrtype = '").append(trimmedType).append('\''));
LOGGER.debug("Deleting {} from database MCRLINKHREF", from);
EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
em.createQuery(sb.toString(), MCRLINKHREF.class)
Expand All @@ -143,17 +143,17 @@ public final int countTo(String fromtype, String to, String type, String restric
EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
Number returns;
StringBuilder qBf = new StringBuilder(1024);
qBf.append("select count(key.mcrfrom) from ").append(classname).append(" where MCRTO like ").append('\'')
qBf.append("select count(key.mcrfrom) from ").append(classname).append(" where key.mcrto like ").append('\'')
.append(to).append('\'');

if (type != null && type.length() != 0) {
qBf.append(" and MCRTYPE = '").append(type).append('\'');
qBf.append(" and key.mcrtype = '").append(type).append('\'');
}
if (restriction != null && restriction.length() != 0) {
qBf.append(" and MCRTO like '").append(restriction).append('\'');
qBf.append(" and key.mcrto like '").append(restriction).append('\'');
}
if (fromtype != null && fromtype.length() != 0) {
qBf.append(" and MCRFROM like '%_").append(fromtype).append("_%'");
qBf.append(" and key.mcrfrom like '%_").append(fromtype).append("_%'");
}

TypedQuery<Number> q = em.createQuery(qBf.toString(), Number.class);
Expand Down
Expand Up @@ -28,11 +28,12 @@

import org.apache.logging.log4j.LogManager;
import org.hibernate.Session;
import org.hibernate.dialect.PostgreSQL9Dialect;
import org.hibernate.dialect.PostgreSQLDialect;
import org.hibernate.engine.jdbc.spi.JdbcServices;
import org.hibernate.internal.SessionFactoryImpl;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.AbstractEntityPersister;
import org.hibernate.metamodel.MappingMetamodel;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.persister.entity.SingleTableEntityPersister;
import org.mycore.datamodel.classifications2.impl.MCRCategoryImpl;

import jakarta.persistence.EntityManagerFactory;
Expand All @@ -50,7 +51,7 @@ public class MCRHibernateConfigHelper {
public static void checkEntityManagerFactoryConfiguration(EntityManagerFactory entityManagerFactory) {
try {
SessionFactoryImpl sessionFactoryImpl = entityManagerFactory.unwrap(SessionFactoryImpl.class);
if (PostgreSQL9Dialect.class
if (PostgreSQLDialect.class
.isInstance(sessionFactoryImpl.getServiceRegistry().getService(JdbcServices.class).getDialect())) {
//fix ClassLeftUnique and ClassRightUnique, as PostgreSQL cannot evaluate them on statement level
modifyConstraints(sessionFactoryImpl);
Expand All @@ -62,9 +63,9 @@ public static void checkEntityManagerFactoryConfiguration(EntityManagerFactory e
}

private static void modifyConstraints(SessionFactoryImpl sessionFactoryImpl) {
ClassMetadata classMetadata = sessionFactoryImpl.getClassMetadata(MCRCategoryImpl.class);
AbstractEntityPersister aep = (AbstractEntityPersister) classMetadata;
String qualifiedTableName = aep.getTableName();
MappingMetamodel mappingMetamodel = sessionFactoryImpl.getMappingMetamodel();
EntityPersister entityPersister = mappingMetamodel.findEntityDescriptor(MCRCategoryImpl.class);
String qualifiedTableName = ((SingleTableEntityPersister) entityPersister).getTableName();
try (Session session = sessionFactoryImpl.openSession()) {
session.doWork(connection -> {
String updateStmt = Stream.of("ClassLeftUnique", "ClassRightUnique")
Expand Down
Expand Up @@ -127,7 +127,7 @@ public boolean existsRule(String objid, String pool) {
public void deleteAccessDefinition(MCRRuleMapping rulemapping) {
EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
em.createQuery(
"delete MCRACCESS " + "where ACPOOL = '" + rulemapping.getPool() + "'" + " AND OBJID = '"
"delete MCRACCESS " + "where key.acpool = '" + rulemapping.getPool() + "'" + " AND key.objid = '"
+ rulemapping.getObjId() + "'")
.executeUpdate();
MCRAccessManager.invalidAllPermissionCachesById(rulemapping.getObjId());
Expand Down Expand Up @@ -188,7 +188,7 @@ public MCRRuleMapping getAccessDefinition(String pool, String objid) {
public ArrayList<String> getMappedObjectId(String pool) {

EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
List<MCRACCESS> l = em.createQuery("from MCRACCESS where ACPOOL = '" + pool + "'", MCRACCESS.class)
List<MCRACCESS> l = em.createQuery("from MCRACCESS where key.acpool = '" + pool + "'", MCRACCESS.class)
.getResultList();
return l.stream()
.map(aL -> aL.getKey().getObjid())
Expand All @@ -199,7 +199,7 @@ public ArrayList<String> getMappedObjectId(String pool) {
public ArrayList<String> getPoolsForObject(String objid) {

EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
List<MCRACCESS> l = em.createQuery("from MCRACCESS where OBJID = '" + objid + "'", MCRACCESS.class)
List<MCRACCESS> l = em.createQuery("from MCRACCESS where key.objid = '" + objid + "'", MCRACCESS.class)
.getResultList();
return l.stream()
.map(access -> access.getKey().getAcpool())
Expand Down
Expand Up @@ -139,7 +139,9 @@ public void updateRule(MCRAccessRule rule) {
@Override
public void deleteRule(String ruleid) {
EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
em.createQuery("delete MCRACCESSRULE where RID = '" + ruleid + "'").executeUpdate();
em.createQuery("delete MCRACCESSRULE where rid = :rid")
.setParameter("rid", ruleid)
.executeUpdate();
ruleCache.invalidate(ruleid);
}

Expand Down Expand Up @@ -185,19 +187,17 @@ public int getNextFreeRuleID(String prefix) {
int ret = 1;
EntityManager em = MCREntityManagerProvider.getCurrentEntityManager();
List<String> l = em
.createQuery("select max(rid) from MCRACCESSRULE where rid like '" + prefix + "%'", String.class)
.createQuery("select max(rid) from MCRACCESSRULE where rid like :like", String.class)
.setParameter("like", prefix + "%")
.getResultList();
if (l.size() > 0) {
String max = l.get(0);
if (max == null) {
ret = 1;
} else {
int lastNumber = Integer.parseInt(max.substring(prefix.length()));
ret = lastNumber + 1;
}
} else {
if (l.isEmpty()) {
return 1;
}
String max = l.get(0);
if (max != null) {
int lastNumber = Integer.parseInt(max.substring(prefix.length()));
ret = lastNumber + 1;
}
return ret;
}
}
Expand Up @@ -113,7 +113,8 @@ private <T> void applyClassificationFilter(MCRObjectQuery query, CriteriaBuilder
cl.get(MCRCategoryLinkImpl_.objectReference).get(MCRCategLinkReference_.OBJECT_ID),
oe.get(MCRObjectInfoEntity_.ID));

Predicate categoryToLink = criteriaBuilder.equal(cl.get(MCRCategoryLinkImpl_.CATEGORY),
Predicate categoryToLink = criteriaBuilder.equal(
cl.get(MCRCategoryLinkImpl_.CATEGORY).get(MCRCategoryImpl_.INTERNAL_ID),
c.get(MCRCategoryImpl_.INTERNAL_ID));

Predicate between = criteriaBuilder.between(
Expand Down
Expand Up @@ -77,7 +77,7 @@ private MCRCategoryID() {
*/
public MCRCategoryID(String rootID, String id) {
this();
setID(id);
setId(id);
setRootID(rootID);
}

Expand Down Expand Up @@ -105,7 +105,7 @@ public static MCRCategoryID fromString(String categoryId) {

@Transient
public boolean isRootID() {
return id == null || id.equals("");
return id == null || id.isEmpty();
}

/*
Expand Down Expand Up @@ -140,10 +140,10 @@ public boolean equals(Object obj) {
}
final MCRCategoryID other = (MCRCategoryID) obj;
if (id == null) {
if (other.id != null && other.id.length() > 0) {
if (other.id != null && !other.id.isEmpty()) {
return false;
}
} else if (!id.equals(other.id) && (id.length() > 0 || other.id != null && other.id.length() >= 0)) {
} else if (!id.equals(other.id) && (!id.isEmpty() || other.id != null && other.id.length() >= 0)) {
return false;
}
if (rootID == null) {
Expand All @@ -153,19 +153,28 @@ public boolean equals(Object obj) {
}
}

/**
* @deprecated Use {@link #getId()} instead.
*/
@Deprecated
@Transient
public String getID(){
return getId();
}

/**
* @return the ID
*/
public String getID() {
public String getId() {
return id == null ? "" : id;
}

/**
* @param id
* the ID to set
*/
private void setID(String id) {
if (id != null && id.length() > 0) {
private void setId(String id) {
if (id != null && !id.isEmpty()) {
if (!VALID_ID.matcher(id).matches()) {
throw new MCRException("category ID '" + id + "' is invalid and does not match: " + VALID_ID);
}
Expand Down Expand Up @@ -225,7 +234,7 @@ private void setRootID(String rootID) {
@Override
@JsonValue
public String toString() {
if (id == null || id.length() == 0) {
if (id == null || id.isEmpty()) {
return rootID;
}
return rootID + ':' + id;
Expand Down
Expand Up @@ -30,7 +30,7 @@

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.annotations.QueryHints;
import org.hibernate.jpa.AvailableHints;
import org.mycore.backend.jpa.MCREntityManagerProvider;
import org.mycore.common.MCRCache;
import org.mycore.common.MCRPersistenceException;
Expand Down Expand Up @@ -346,7 +346,7 @@ public boolean isInCategory(MCRCategLinkReference reference, MCRCategoryID id) {
setCacheable(q);
setReadOnly(q);
q.setParameter("rootID", id.getRootID());
q.setParameter("categID", id.getID());
q.setParameter("categID", id.getId());
q.setParameter("objectID", reference.getObjectID());
q.setParameter("type", reference.getType());
return !q.getResultList().isEmpty();
Expand All @@ -363,7 +363,7 @@ public Collection<MCRCategLinkReference> getReferences(String type) {
.createQuery(
query.select(objectReferencePath)
.where(cb.equal(objectReferencePath.get(MCRCategLinkReference_.type), type)))
.setHint(QueryHints.READ_ONLY, "true")
.setHint(AvailableHints.HINT_READ_ONLY, "true")
.getResultList();
}

Expand Down
Expand Up @@ -264,7 +264,7 @@ public List<MCRCategory> getParents(MCRCategoryID id) {
Query parentQuery = entityManager
.createNamedQuery(NAMED_QUERY_NAMESPACE + "parentQuery")
.setParameter("classID", id.getRootID())
.setParameter("categID", id.getID())
.setParameter("categID", id.getId())
.setParameter("left", leftRight.leftValue)
.setParameter("right", leftRight.rightValue);
@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -616,7 +616,7 @@ public static MCRCategoryImpl getByNaturalID(EntityManager entityManager, MCRCat
TypedQuery<MCRCategoryImpl> naturalIDQuery = entityManager
.createNamedQuery(NAMED_QUERY_NAMESPACE + "byNaturalId", MCRCategoryImpl.class)
.setParameter("classID", id.getRootID())
.setParameter("categID", id.getID());
.setParameter("categID", id.getId());
return getSingleResult(naturalIDQuery);
}

Expand Down Expand Up @@ -650,7 +650,7 @@ private static int getNumberOfChildren(EntityManager entityManager, MCRCategoryI
return getSingleResult(entityManager
.createNamedQuery(NAMED_QUERY_NAMESPACE + "childCount")
.setParameter("classID", id.getRootID())
.setParameter("categID", id.getID()));
.setParameter("categID", id.getId()));
}

private static void updateLeftRightValue(EntityManager entityManager, String classID, int left,
Expand Down
Expand Up @@ -127,7 +127,7 @@
@NamedQuery(name = "MCRCategory.rootIds", query = "SELECT cat.id FROM MCRCategoryImpl cat WHERE cat.left = 0"),
@NamedQuery(name = "MCRCategory.childCount",
query = "SELECT CAST(count(*) AS integer) FROM MCRCategoryImpl children WHERE "
+ "children.parent=(SELECT cat.internalID FROM MCRCategoryImpl cat WHERE "
+ "children.parent.internalID=(SELECT cat.internalID FROM MCRCategoryImpl cat WHERE "
+ "cat.id.rootID=:classID and (cat.id.id=:categID OR cat.id.id IS NULL AND :categID IS NULL))"),
})

Expand Down Expand Up @@ -269,7 +269,7 @@ private int getPositionInParentByID() {
.getChildren()
.stream()
.map(MCRCategory::getId)
.map(MCRCategoryID::getID)
.map(MCRCategoryID::getId)
.collect(Collectors.joining(", ")));
}

Expand Down Expand Up @@ -465,14 +465,14 @@ public void setRootID(String rootID) {
if (getId() == null) {
setId(MCRCategoryID.rootID(rootID));
} else if (!getId().getRootID().equals(rootID)) {
setId(new MCRCategoryID(rootID, getId().getID()));
setId(new MCRCategoryID(rootID, getId().getId()));
}
}

public void setCategID(String categID) {
if (getId() == null) {
setId(new MCRCategoryID(null, categID));
} else if (!getId().getID().equals(categID)) {
} else if (!getId().getId().equals(categID)) {
setId(new MCRCategoryID(getId().getRootID(), categID));
}
}
Expand Down

0 comments on commit 423c8a8

Please sign in to comment.