From a9a227a99c552231511fd0c28460bd399058fecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Quirin=20K=C3=B6rbel?= Date: Tue, 5 Aug 2025 15:58:12 +0200 Subject: [PATCH 1/2] HHH-19684 --- .../AbstractPostgreSQLStructJdbcType.java | 2 +- .../component/StructComponentEnumTest.java | 111 ++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 hibernate-core/src/test/java/org/hibernate/orm/test/component/StructComponentEnumTest.java diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java b/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java index 5a28ee9ef16d..9be732573b07 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java @@ -1232,7 +1232,7 @@ private void serializeConvertedBasicTo( case SqlTypes.ENUM: case SqlTypes.NAMED_ENUM: appender.quoteStart(); - appender.append( (String) subValue ); + appender.append( subValue.toString() ); appender.quoteEnd(); break; case SqlTypes.DATE: diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/component/StructComponentEnumTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/component/StructComponentEnumTest.java new file mode 100644 index 000000000000..69c61f6a275c --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/component/StructComponentEnumTest.java @@ -0,0 +1,111 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.orm.test.component; + + +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.annotations.Struct; + +import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.testing.orm.junit.DomainModel; +import org.hibernate.testing.orm.junit.RequiresDialect; +import org.hibernate.testing.orm.junit.SessionFactory; +import org.hibernate.testing.orm.junit.SessionFactoryScope; +import org.hibernate.type.SqlTypes; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; + +@DomainModel( + annotatedClasses = { + StructComponentEnumTest.Book.class, + StructComponentEnumTest.Publisher.class + } +) +@SessionFactory +@RequiresDialect(PostgreSQLDialect.class) +public class StructComponentEnumTest { + + @Test + public void save(SessionFactoryScope scope){ + scope.inTransaction( + session -> { + + Book book = new Book(); + book.title = "Hibernate"; + book.author = "Steve"; + book.publisher = new Publisher( "penguin", PublisherType.TRADITIONAL ); + + session.persist( book ); + } + ); + } + + @AfterEach + public void tearDown(SessionFactoryScope scope){ + scope.getSessionFactory().getSchemaManager().truncate(); + } + + @Entity(name = "Book") + public static class Book { + + @Id + @GeneratedValue + private Long id; + + private String title; + + private String author; + + private Publisher publisher; + } + + @Embeddable + @Struct( name = "publisher_type") + public static class Publisher { + + private String name; + + @Enumerated(EnumType.STRING) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) + private PublisherType type; + + public Publisher(String name, PublisherType type) { + this.name = name; + this.type = type; + } + + public Publisher() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public PublisherType getType() { + return type; + } + + public void setType(PublisherType type) { + this.type = type; + } + } + + public enum PublisherType { + TRADITIONAL, SELF_PUBLISHED, PRINT_ON_DEMAND + } + + +} From 9f19f7d31541f0a4eccec443c8f7dc3b6fbdc108 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Fri, 8 Aug 2025 11:04:01 +0200 Subject: [PATCH 2/2] Update hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java --- .../dialect/type/AbstractPostgreSQLStructJdbcType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java b/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java index 9be732573b07..76cef6169067 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/type/AbstractPostgreSQLStructJdbcType.java @@ -1232,7 +1232,7 @@ private void serializeConvertedBasicTo( case SqlTypes.ENUM: case SqlTypes.NAMED_ENUM: appender.quoteStart(); - appender.append( subValue.toString() ); + appender.append( jdbcJavaType.unwrap( subValue, String.class, options ) ); appender.quoteEnd(); break; case SqlTypes.DATE: