Skip to content

Commit a88b098

Browse files
authored
fix: fix bug in generateNewIdentifierByStoredProcedure (#12127)
* fix: fix bug in generateNewIdentifierByStoredProcedure * fix: fix bug in generateNewIdentifierByStoredProcedure * docs: add release note for #12127
1 parent bef0f83 commit a88b098

3 files changed

Lines changed: 12 additions & 26 deletions

File tree

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
This release fixes a bug which prevents PIDs from being generated when the `identifier-generation-style` is set to `storedProcGenerated`.
2+
3+
Previously, this caused a database error ("ERROR: procedure generateidentifierfromstoredprocedure(unknown) does not exist").

src/main/java/edu/harvard/iq/dataverse/Dataset.java

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,10 @@
2828
import jakarta.persistence.NamedNativeQuery;
2929
import jakarta.persistence.NamedQueries;
3030
import jakarta.persistence.NamedQuery;
31-
import jakarta.persistence.NamedStoredProcedureQuery;
3231
import jakarta.persistence.OneToMany;
3332
import jakarta.persistence.OneToOne;
3433
import jakarta.persistence.OrderBy;
35-
import jakarta.persistence.ParameterMode;
3634
import jakarta.persistence.SqlResultSetMapping;
37-
import jakarta.persistence.StoredProcedureParameter;
3835
import jakarta.persistence.Table;
3936
import jakarta.persistence.Temporal;
4037
import jakarta.persistence.TemporalType;
@@ -94,25 +91,6 @@
9491
}
9592
)
9693

97-
/*
98-
Below is the database stored procedure for getting a string dataset id.
99-
Used when the Dataverse is (optionally) configured to use
100-
procedurally generated values for dataset ids, instead of the default
101-
random strings.
102-
103-
The use of a stored procedure to create an identifier is explained in the
104-
installation documentation (where an example script is supplied).
105-
The stored procedure can be implemented using other SQL flavors -
106-
without having to modify the application code.
107-
-- L.A. 4.6.2 (modified by C.S. for version 5.4.1+)
108-
*/
109-
@NamedStoredProcedureQuery(
110-
name = "Dataset.generateIdentifierFromStoredProcedure",
111-
procedureName = "generateIdentifierFromStoredProcedure",
112-
parameters = {
113-
@StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class)
114-
}
115-
)
11694
@Entity
11795
@Table(indexes = {
11896
@Index(columnList = "guestbook_id"),

src/main/java/edu/harvard/iq/dataverse/DvObjectServiceBean.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
import jakarta.persistence.NonUniqueResultException;
2525
import jakarta.persistence.PersistenceContext;
2626
import jakarta.persistence.Query;
27-
import jakarta.persistence.StoredProcedureQuery;
2827

2928
import org.apache.commons.lang3.StringUtils;
29+
import org.eclipse.persistence.exceptions.DatabaseException;
3030

3131
/**
3232
* Your goto bean for everything {@link DvObject}, that's not tied to any
@@ -402,9 +402,14 @@ public Map<Long, String> getObjectPathsByIds(Set<Long> objectIds){
402402
}
403403

404404
public String generateNewIdentifierByStoredProcedure() {
405-
StoredProcedureQuery query = this.em.createNamedStoredProcedureQuery("Dataset.generateIdentifierFromStoredProcedure");
406-
query.execute();
407-
return (String) query.getOutputParameterValue(1);
405+
try {
406+
Query query = em.createNativeQuery("SELECT generateIdentifierFromStoredProcedure()");
407+
return (String) query.getSingleResult();
408+
} catch (DatabaseException e) {
409+
// It's possible that the function "generateIdentifierFromStoredProcedure" is not defined in the database
410+
logger.severe("Error generating identifier using stored procedure: " + e.getMessage());
411+
return null;
412+
}
408413
}
409414

410415
/** @deprecated Backward-compatibility method to get the effective pid generator for a DvObjectContainer.

0 commit comments

Comments
 (0)