https://discourse.hibernate.org/t/hibernate-6-and-java-records-unable-so-persist/7761 Test case: {{package org.hibernate.bugs; import jakarta.persistence.*; import org.junit.After; import org.junit.Before; import org.junit.Test; /**
- This template demonstrates how to develop a test case for Hibernate ORM, using the Java Persistence API.
*/ public class JPAUnitTestCase {
private EntityManagerFactory entityManagerFactory; @Before public void init() { entityManagerFactory = Persistence.createEntityManagerFactory( "templatePU" ); } @After public void destroy() { entityManagerFactory.close(); } // Entities are auto-discovered, so just add them anywhere on class-path // Add your tests, using standard JUnit. @Test public void test() { EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist( new MyEntity( 1L, new MyRecord( "test", "abc" ) ) ); entityManager.getTransaction().commit(); entityManager.close(); entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.merge( new MyEntity( 1L, new MyRecord( "test", "d" ) ) ); entityManager.getTransaction().commit(); entityManager.close(); } @Entity(name = "MyEntity") public static class MyEntity { @Id Long id; @Embedded MyRecord record; public MyEntity() { } public MyEntity(Long id, MyRecord record) { this.id = id; this.record = record; } public Long getId() { return id; } public MyRecord getRecord() { return record; } public void setId(Long id) { this.id = id; } public void setRecord(MyRecord record) { this.record = record; } } @Embeddable public static record MyRecord(String name, String description) {} }}} Exception: {{2023-06-06 17:13:47 INFO LogHelper:31 - HHH000204: Processing PersistenceUnitInfo [name: templatePU] 2023-06-06 17:13:47 INFO Version:44 - HHH000412: Hibernate ORM core version 6.2.4.Final 2023-06-06 17:13:47 INFO Environment:159 - HHH000205: Loaded properties from resource hibernate.properties: {hibernate.format_sql=true, jakarta.persistence.validation.mode=NONE, hibernate.dialect=org.hibernate.dialect.H2Dialect, hibernate.connection.username=sa, hibernate.connection.url=jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1, hibernate.max_fetch_depth=5, hibernate.show_sql=false, hibernate.jdbc.batch_versioned_data=true, hibernate.connection.driver_class=org.h2.Driver, hibernate.connection.password=****, hibernate.bytecode.use_reflection_optimizer=true, hibernate.cache.region_prefix=hibernate.test, hibernate.connection.pool_size=5, hibernate.cache.region.factory_class=org.hibernate.testing.cache.CachingRegionFactory, hibernate.service.allow_crawling=false, hibernate.session.events.log=true} 2023-06-06 17:13:47 INFO Environment:191 - HHH000406: Using bytecode reflection optimizer 2023-06-06 17:13:47 WARN CachingRegionFactory:48 - org.hibernate.testing.cache.CachingRegionFactory should be only used for testing. 2023-06-06 17:13:47 WARN pooling:80 - HHH10001002: Using built-in connection pool (not intended for production use) 2023-06-06 17:13:47 INFO pooling:139 - HHH10001005: Loaded JDBC driver class: org.h2.Driver 2023-06-06 17:13:47 INFO pooling:161 - HHH10001012: Connecting with JDBC URL [jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1] 2023-06-06 17:13:47 INFO pooling:170 - HHH10001001: Connection properties: {password=****, user=sa} 2023-06-06 17:13:47 INFO pooling:174 - HHH10001003: Autocommit mode: false 2023-06-06 17:13:47 INFO pooling:366 - HHH10001115: Connection pool size: 5 (min=1) 2023-06-06 17:13:48 INFO BytecodeProviderInitiator:53 - HHH000021: Bytecode provider name : bytebuddy 2023-06-06 17:13:48 INFO JtaPlatformInitiator:51 - HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.WildFlyStandAloneJtaPlatform] Hibernate: drop table if exists MyEntity cascade 2023-06-06 17:13:48 INFO access:52 - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4b9c411] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: create table MyEntity ( id bigint not null, description varchar(255), name varchar(255), primary key (id) ) 2023-06-06 17:13:48 INFO access:52 - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@3e4d40ea] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: insert into MyEntity (name,description,id) values (?,?,?) 2023-06-06 17:13:48 INFO StatisticalLoggingSessionEventListener:261 - Session Metrics { 30649 nanoseconds spent acquiring 1 JDBC connections; 73209 nanoseconds spent releasing 1 JDBC connections; 1667250 nanoseconds spent preparing 1 JDBC statements; 642541 nanoseconds spent executing 1 JDBC statements; 0 nanoseconds spent executing 0 JDBC batches; 0 nanoseconds spent performing 0 L2C puts; 0 nanoseconds spent performing 0 L2C hits; 0 nanoseconds spent performing 0 L2C misses; 25512091 nanoseconds spent executing 1 flushes (flushing a total of 1 entities and 0 collections); 0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections) } Hibernate: select m1_0.id, m1_0.name, m1_0.description from MyEntity m1_0 where m1_0.id=? Hibernate: drop table if exists MyEntity cascade 2023-06-06 17:13:48 INFO access:52 - HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@388be5fd] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. 2023-06-06 17:13:48 INFO pooling:608 - HHH10001008: Cleaning up connection pool [jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1] 2023-06-06 17:13:48 ERROR pooling:470 - Connection leak detected: there are 1 unclosed connections upon shutting down pool jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1 2023-06-06 17:13:48 ERROR pooling:301 - Connection leak detected: there are 1 unclosed connections org.hibernate.PropertyAccessException: Could not set value of type [java.lang.String] : `org.hibernate.bugs.JPAUnitTestCase$MyRecord.name` (setter) at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:86) at org.hibernate.metamodel.mapping.internal.AbstractEmbeddableMapping.setValues(AbstractEmbeddableMapping.java:112) at org.hibernate.type.ComponentType.setPropertyValues(ComponentType.java:450) at org.hibernate.type.ComponentType.replace(ComponentType.java:564) at org.hibernate.type.TypeHelper.replace(TypeHelper.java:89) at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:502) at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:354) at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:149) at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:142) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126) at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:80) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127) at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:848) at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:834) at org.hibernate.bugs.JPAUnitTestCase.test(JPAUnitTestCase.java:43) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: java.lang.IllegalAccessException: Can not set final java.lang.String field org.hibernate.bugs.JPAUnitTestCase$MyRecord.name to java.lang.String at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:76) at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:80) at java.base/jdk.internal.reflect.UnsafeQualifiedObjectFieldAccessorImpl.set(UnsafeQualifiedObjectFieldAccessorImpl.java:79) at java.base/java.lang.reflect.Field.set(Field.java:799) at org.hibernate.property.access.spi.SetterFieldImpl.set(SetterFieldImpl.java:55) ... 43 more }} |