Skip to content

Commit 10a654c

Browse files
marko-bekhtambellade
authored andcommitted
HHH-19306 Only apply the composite sub-generator if the type is acceptable
1 parent a5d3e32 commit 10a654c

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

hibernate-core/src/main/java/org/hibernate/tuple/entity/CompositeGeneratorBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public Object generate(SharedSessionContractImplementor session, Object owner, O
183183
final Object[] generatedValues = new Object[size];
184184
for ( int i = 0; i < size; i++ ) {
185185
final Generator generator = generators.get( i );
186-
if ( generator != null ) {
186+
if ( generator != null && generator.getEventTypes().contains( eventType ) ) {
187187
generatedValues[i] = ((BeforeExecutionGenerator) generator)
188188
.generate( session, owner, null, eventType );
189189
}
@@ -193,7 +193,7 @@ public Object generate(SharedSessionContractImplementor session, Object owner, O
193193
else {
194194
for ( int i = 0; i < size; i++ ) {
195195
final Generator generator = generators.get( i );
196-
if ( generator != null ) {
196+
if ( generator != null && generator.getEventTypes().contains( eventType ) ) {
197197
final Object value = descriptor.getValue( currentValue, i );
198198
final Object generatedValue = ((BeforeExecutionGenerator) generator)
199199
.generate( session, owner, value, eventType );
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.annotations;
6+
7+
import jakarta.persistence.*;
8+
import org.hibernate.annotations.CreationTimestamp;
9+
import org.hibernate.annotations.UpdateTimestamp;
10+
import org.hibernate.testing.orm.junit.DomainModel;
11+
import org.hibernate.testing.orm.junit.SessionFactory;
12+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
13+
import org.junit.jupiter.api.AfterEach;
14+
import org.junit.jupiter.api.BeforeEach;
15+
import org.junit.jupiter.api.Test;
16+
17+
import java.time.LocalDateTime;
18+
19+
import static org.assertj.core.api.Assertions.assertThat;
20+
21+
@DomainModel(
22+
annotatedClasses = {
23+
CreationUpdatedTimestampInEmbeddableTest.Event.class,
24+
CreationUpdatedTimestampInEmbeddableTest.History.class,
25+
}
26+
)
27+
@SessionFactory
28+
class CreationUpdatedTimestampInEmbeddableTest {
29+
30+
@BeforeEach
31+
void setUp(SessionFactoryScope scope) {
32+
scope.inTransaction( session -> {
33+
Event event = new Event();
34+
event.id = 1L;
35+
event.name = "conference";
36+
session.persist( event );
37+
} );
38+
}
39+
40+
@AfterEach
41+
void tearDown(SessionFactoryScope scope) {
42+
scope.inTransaction( session -> {
43+
session.createMutationQuery( "delete Event" ).executeUpdate();
44+
} );
45+
}
46+
47+
@Test
48+
void test(SessionFactoryScope scope) {
49+
LocalDateTime created = scope.fromTransaction( session -> {
50+
Event fruit = session.get( Event.class, 1L );
51+
return fruit.history.created;
52+
} );
53+
54+
scope.inTransaction( session -> {
55+
Event event = session.get( Event.class, 1L );
56+
event.name = "concert";
57+
} );
58+
59+
scope.inTransaction( session -> {
60+
Event event = session.get( Event.class, 1L );
61+
assertThat( event.history.created ).isEqualTo( created );
62+
assertThat( event.history.updated ).isNotEqualTo( created );
63+
assertThat( event.name ).isEqualTo( "concert" );
64+
} );
65+
}
66+
67+
@Entity(name = "Event")
68+
public static class Event {
69+
70+
@Id
71+
public Long id;
72+
73+
public String name;
74+
75+
@Embedded
76+
public History history;
77+
78+
}
79+
80+
@Embeddable
81+
public static class History {
82+
@Column
83+
@CreationTimestamp
84+
public LocalDateTime created;
85+
86+
@Column
87+
@UpdateTimestamp
88+
public LocalDateTime updated;
89+
}
90+
}

0 commit comments

Comments
 (0)