Omar aloraini (
https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=5d21a95...
) *created* an issue
Hibernate ORM (
https://hibernate.atlassian.net/browse/HHH?atlOrigin=eyJpIjoiNzlmZWJmMGUw...
) / Bug (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiNzlmZW...
) HHH-16759 (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiNzlmZW...
) Merge fails when entity has an Embedded Java record (
https://hibernate.atlassian.net/browse/HHH-16759?atlOrigin=eyJpIjoiNzlmZW...
)
Issue Type: Bug Affects Versions: 6.2.4 Assignee: Unassigned Components: hibernate-core
Created: 06/Jun/2023 07:14 AM Priority: Minor Reporter: Omar aloraini (
https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=5d21a95...
)
https://discourse.hibernate.org/t/hibernate-6-and-java-records-unable-so-...
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
}}
(
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 )