java-topology/defects/hibernate/patch/hibernate-0002-foreignkey-referenced-cols-hashset.patch

39 lines
1.5 KiB
Diff

# UNDF: UNDF-2026-000000108
--- a/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java
+++ b/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java
@@ -6,6 +6,7 @@ package org.hibernate.mapping;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
import org.hibernate.Internal;
@@ -28,7 +29,12 @@ public class ForeignKey extends Constraint {
private Table referencedTable;
private String referencedEntityName;
private String keyDefinition;
private OnDeleteAction onDeleteAction;
- private final List<Column> referencedColumns = new ArrayList<>();
+ // hibernate-0002 fix: LinkedHashSet for O(1) contains() in addReferencedColumn().
+ // Previously ArrayList<Column>: addReferencedColumn() called contains() O(C)
+ // and addReferencedColumns(List) loops over the input list, giving O(C²).
+ // LinkedHashSet preserves insertion order for callers that iterate getReferencedColumns().
+ private final LinkedHashSet<Column> referencedColumnsSet = new LinkedHashSet<>();
private boolean creationEnabled = true;
@@ -170,9 +176,9 @@ public class ForeignKey extends Constraint {
private void addReferencedColumn(Column column) {
- if ( !referencedColumns.contains( column ) ) {
- referencedColumns.add( column );
- }
+ // O(1) with LinkedHashSet; was O(C) with ArrayList
+ referencedColumnsSet.add( column );
}
public List<Column> getReferencedColumns() {
- return referencedColumns;
+ return new ArrayList<>( referencedColumnsSet );
}