Omar aloraini (
https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=5d21a95...
) *updated* an issue
Hibernate ORM (
https://hibernate.atlassian.net/browse/HHH?atlOrigin=eyJpIjoiY2NiNTZiZjk0...
) / Bug (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiY2NiNT...
) HHH-16759 (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiY2NiNT...
) Merge fails when entity has an Embedded Java record (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiY2NiNT...
)
Change By: Omar aloraini (
https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=5d21a95...
)
[
https://discourse.hibernate.org/t/hibernate-6-and-java-records-unable-so-...
|https://discourse.hibernate.org/t/hibernate-6-and-java-records-unable-so-persist/7761]
Test case:
{ { noformat} 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) {}
} {noformat } }
Exception:
{ { noformat} 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
{noformat } }
(
https://hibernate.atlassian.net/browse/HHH-16759#add-comment?atlOrigin=ey...
) Add Comment (
https://hibernate.atlassian.net/browse/HHH-16759#add-comment?atlOrigin=ey...
)
Get Jira notifications on your phone! Download the Jira Cloud app for Android (
https://play.google.com/store/apps/details?id=com.atlassian.android.jira....
) or iOS (
https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&ct=Em...
) This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100225- sha1:3b7cdab )