From ed884ca040950a715f310293de233e02bd973fd9 Mon Sep 17 00:00:00 2001 From: Georg Echterling Date: Wed, 30 Nov 2022 11:49:31 +0100 Subject: [PATCH 1/2] HHH-15784 Add test for primitive array as NaturalId. --- .../PrimitiveArrayNaturalIdTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/uniquekey/PrimitiveArrayNaturalIdTest.java diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/uniquekey/PrimitiveArrayNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/uniquekey/PrimitiveArrayNaturalIdTest.java new file mode 100644 index 000000000000..d2f93d444c90 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/uniquekey/PrimitiveArrayNaturalIdTest.java @@ -0,0 +1,68 @@ +package org.hibernate.orm.test.uniquekey; + +import org.hibernate.NaturalIdLoadAccess; +import org.hibernate.annotations.NaturalId; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.junit.jupiter.api.Test; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@TestForIssue(jiraKey = "HHH-15784") +@DomainModel(annotatedClasses = PrimitiveArrayNaturalIdTest.HashedContent.class) +@SessionFactory +public class PrimitiveArrayNaturalIdTest { + + @Test + public void testPersistByteArrayNaturalId(SessionFactoryScope scope) { + final byte[] naturalId = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + scope.inTransaction( + session -> { + HashedContent content = new HashedContent( + 1, + naturalId, + "content" + ); + + session.persist( content ); + } + ); + + scope.inTransaction( + session -> { + NaturalIdLoadAccess content = session.byNaturalId( HashedContent.class ).using( + "binaryHash", + naturalId + ); + assertNotNull(content); + } + ); + } + + @Entity(name = "HashedContent") + public static class HashedContent { + @Id + private Integer id; + + @NaturalId + private byte[] binaryHash; + + private String name; + + public HashedContent() { + } + + public HashedContent(Integer id, byte[] binaryHash, String name) { + this.id = id; + this.binaryHash = binaryHash; + this.name = name; + } + } + +} From f8d6ba41a51e17f5ef2cc8fee317ef485cba17b5 Mon Sep 17 00:00:00 2001 From: Georg Echterling Date: Wed, 30 Nov 2022 11:50:06 +0100 Subject: [PATCH 2/2] HHH-15784 Fix primitive array as NaturalId. --- .../metamodel/mapping/internal/SimpleNaturalIdMapping.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java index 74276b32dfcf..281da272cad4 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/SimpleNaturalIdMapping.java @@ -114,7 +114,8 @@ public void validateInternalForm(Object naturalIdValue, SharedSessionContractImp return; } - if ( naturalIdValue.getClass().isArray() ) { + final Class naturalIdValueClass = naturalIdValue.getClass(); + if ( naturalIdValueClass.isArray() && !naturalIdValueClass.getComponentType().isPrimitive() ) { // be flexible final Object[] values = (Object[]) naturalIdValue; if ( values.length == 1 ) { @@ -128,7 +129,7 @@ public void validateInternalForm(Object naturalIdValue, SharedSessionContractImp Locale.ROOT, "Incoming natural-id value [%s (`%s`)] is not of expected type [`%s`] and could not be coerced", naturalIdValue, - naturalIdValue.getClass().getName(), + naturalIdValueClass.getName(), getJavaType().getJavaType().getTypeName() ) );