Skip to content

Commit e024bd0

Browse files
committed
HHH-18773 Deduplicate result initializers to avoid double initialization issues
1 parent a63716d commit e024bd0

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/internal/JdbcValuesMappingResolutionImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55
package org.hibernate.sql.results.jdbc.internal;
66

7-
import java.util.ArrayList;
7+
import java.util.LinkedHashSet;
88

99
import org.hibernate.sql.results.graph.DomainResultAssembler;
1010
import org.hibernate.sql.results.graph.Initializer;
@@ -37,7 +37,7 @@ private JdbcValuesMappingResolutionImpl(
3737
}
3838

3939
private static Initializer<?>[] getResultInitializers(DomainResultAssembler<?>[] resultAssemblers) {
40-
final ArrayList<Initializer<?>> initializers = new ArrayList<>( resultAssemblers.length );
40+
final LinkedHashSet<Initializer<?>> initializers = new LinkedHashSet<>( resultAssemblers.length );
4141
for ( DomainResultAssembler<?> resultAssembler : resultAssemblers ) {
4242
resultAssembler.forEachResultAssembler( (initializer, list) -> list.add( initializer ), initializers );
4343
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.orm.test.query;
6+
7+
import org.hibernate.testing.orm.junit.DomainModel;
8+
import org.hibernate.testing.orm.junit.SessionFactory;
9+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
10+
import org.junit.jupiter.api.AfterEach;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
14+
import jakarta.persistence.Entity;
15+
import jakarta.persistence.Id;
16+
17+
@DomainModel(annotatedClasses = {
18+
SelectJoinedAssociationMultipleTimesTest.Book.class
19+
})
20+
@SessionFactory
21+
public class SelectJoinedAssociationMultipleTimesTest {
22+
23+
@Test
24+
public void test(SessionFactoryScope scope) {
25+
scope.inTransaction(
26+
session -> {
27+
// Add a proxy first to trigger the error
28+
session.getReference( Book.class, 1 );
29+
session.createSelectionQuery( "select b b1, b b2 from Book b", Object[].class ).getResultList();
30+
}
31+
);
32+
}
33+
34+
@BeforeEach
35+
public void prepareTestData(SessionFactoryScope scope) {
36+
scope.inTransaction( (session) -> session.persist( new Book( 1, "First book" ) ) );
37+
}
38+
39+
@AfterEach
40+
public void dropTestData(SessionFactoryScope scope) {
41+
scope.inTransaction( (session) -> session.createMutationQuery( "delete Book" ).executeUpdate() );
42+
}
43+
44+
@Entity( name = "Book")
45+
public static class Book {
46+
@Id
47+
private Integer id;
48+
private String name;
49+
50+
public Book() {
51+
}
52+
53+
public Book(Integer id, String name) {
54+
this.id = id;
55+
this.name = name;
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)