Skip to content

Commit 67d35af

Browse files
committed
HHH-6598 - Immutable entities should not have up-to-date checks performed on a flush
1 parent bce6ff5 commit 67d35af

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

hibernate-core/src/main/java/org/hibernate/event/internal/DefaultFlushEntityEventListener.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,12 @@ public void onFlushEntity(FlushEntityEvent event) throws HibernateException {
120120
final var entry = event.getEntityEntry();
121121
final var session = event.getSession();
122122

123+
// short-circuit for immutable entities....
124+
if ( !entry.getPersister().isMutable() && !entry.getPersister().hasCollections() ) {
125+
// nothing to do
126+
return;
127+
}
128+
123129
final boolean mightBeDirty = entry.requiresDirtyCheck( entity );
124130

125131
final Object[] values = getValues( entity, entry, mightBeDirty, session );
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.immutable;
6+
7+
import jakarta.persistence.Entity;
8+
import jakarta.persistence.Id;
9+
import jakarta.persistence.Table;
10+
import org.hibernate.annotations.Immutable;
11+
import org.hibernate.testing.orm.junit.DomainModel;
12+
import org.hibernate.testing.orm.junit.SessionFactory;
13+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
14+
import org.junit.jupiter.api.BeforeEach;
15+
import org.junit.jupiter.api.Test;
16+
17+
import static org.assertj.core.api.Assertions.assertThat;
18+
19+
/**
20+
* @author Steve Ebersole
21+
*/
22+
@DomainModel(annotatedClasses = ImmutableDirtinessCheckingTests.ReferenceData.class)
23+
@SessionFactory
24+
public class ImmutableDirtinessCheckingTests {
25+
@Test
26+
void testDirtyCheckingBehavior(SessionFactoryScope factoryScope) {
27+
factoryScope.inTransaction( (session) -> {
28+
var data = session.find( ReferenceData.class, 1 );
29+
data.setName( "another value" );
30+
nameAccessCount = 0;
31+
session.flush();
32+
assertThat( nameAccessCount ).isEqualTo( 0 );
33+
} );
34+
35+
factoryScope.inTransaction( (session) -> {
36+
var data = session.find( ReferenceData.class, 1 );
37+
assertThat( data.getName() ).isEqualTo( "initial value" );
38+
} );
39+
}
40+
41+
@BeforeEach
42+
void prepareTestData(SessionFactoryScope factoryScope) {
43+
factoryScope.inTransaction( (session) -> {
44+
session.persist( new ReferenceData( 1, "initial value" ) );
45+
} );
46+
}
47+
48+
@Test
49+
void dropTestData(SessionFactoryScope factoryScope) {
50+
factoryScope.dropData();
51+
}
52+
53+
private static int nameAccessCount = 0;
54+
55+
@Entity(name="ReferenceData")
56+
@Table(name="ReferenceData")
57+
@Immutable
58+
public static class ReferenceData {
59+
private Integer id;
60+
private String name;
61+
62+
public ReferenceData() {
63+
}
64+
65+
public ReferenceData(Integer id, String name) {
66+
this.id = id;
67+
this.name = name;
68+
}
69+
70+
@Id
71+
public Integer getId() {
72+
return id;
73+
}
74+
75+
public void setId(Integer id) {
76+
this.id = id;
77+
}
78+
79+
public String getName() {
80+
nameAccessCount++;
81+
return name;
82+
}
83+
84+
public void setName(String name) {
85+
this.name = name;
86+
}
87+
}
88+
}

0 commit comments

Comments
 (0)