diff --git a/doc/release-notes/12127-fix-stored-proc-generated-pids.md b/doc/release-notes/12127-fix-stored-proc-generated-pids.md new file mode 100644 index 00000000000..968bd6007b9 --- /dev/null +++ b/doc/release-notes/12127-fix-stored-proc-generated-pids.md @@ -0,0 +1,3 @@ +This release fixes a bug which prevents PIDs from being generated when the `identifier-generation-style` is set to `storedProcGenerated`. + +Previously, this caused a database error ("ERROR: procedure generateidentifierfromstoredprocedure(unknown) does not exist"). \ No newline at end of file diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index e7e5903482c..42e5c1bbaab 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -28,13 +28,10 @@ import jakarta.persistence.NamedNativeQuery; import jakarta.persistence.NamedQueries; import jakarta.persistence.NamedQuery; -import jakarta.persistence.NamedStoredProcedureQuery; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.persistence.OrderBy; -import jakarta.persistence.ParameterMode; import jakarta.persistence.SqlResultSetMapping; -import jakarta.persistence.StoredProcedureParameter; import jakarta.persistence.Table; import jakarta.persistence.Temporal; import jakarta.persistence.TemporalType; @@ -94,25 +91,6 @@ } ) -/* - Below is the database stored procedure for getting a string dataset id. - Used when the Dataverse is (optionally) configured to use - procedurally generated values for dataset ids, instead of the default - random strings. - - The use of a stored procedure to create an identifier is explained in the - installation documentation (where an example script is supplied). - The stored procedure can be implemented using other SQL flavors - - without having to modify the application code. - -- L.A. 4.6.2 (modified by C.S. for version 5.4.1+) -*/ -@NamedStoredProcedureQuery( - name = "Dataset.generateIdentifierFromStoredProcedure", - procedureName = "generateIdentifierFromStoredProcedure", - parameters = { - @StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class) - } -) @Entity @Table(indexes = { @Index(columnList = "guestbook_id"), diff --git a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java index 91c507774e9..0f39459f8cd 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java @@ -24,9 +24,9 @@ import jakarta.persistence.NonUniqueResultException; import jakarta.persistence.PersistenceContext; import jakarta.persistence.Query; -import jakarta.persistence.StoredProcedureQuery; import org.apache.commons.lang3.StringUtils; +import org.eclipse.persistence.exceptions.DatabaseException; /** * Your goto bean for everything {@link DvObject}, that's not tied to any @@ -402,9 +402,14 @@ public Map getObjectPathsByIds(Set objectIds){ } public String generateNewIdentifierByStoredProcedure() { - StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery("Dataset.generateIdentifierFromStoredProcedure"); - query.execute(); - return (String) query.getOutputParameterValue(1); + try { + Query query = em.createNativeQuery("SELECT generateIdentifierFromStoredProcedure()"); + return (String) query.getSingleResult(); + } catch (DatabaseException e) { + // It's possible that the function "generateIdentifierFromStoredProcedure" is not defined in the database + logger.severe("Error generating identifier using stored procedure: " + e.getMessage()); + return null; + } } /** @deprecated Backward-compatibility method to get the effective pid generator for a DvObjectContainer.