Skip to content

Commit 3d767a1

Browse files
committed
HHH-18608 Add test for issue
1 parent e7f5f88 commit 3d767a1

File tree

2 files changed

+414
-0
lines changed

2 files changed

+414
-0
lines changed
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
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.bytecode.enhancement.batch;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import org.hibernate.Hibernate;
11+
import org.hibernate.annotations.BatchSize;
12+
import org.hibernate.cfg.AvailableSettings;
13+
14+
import org.hibernate.testing.bytecode.enhancement.extension.BytecodeEnhanced;
15+
import org.hibernate.testing.orm.junit.DomainModel;
16+
import org.hibernate.testing.orm.junit.JiraKey;
17+
import org.hibernate.testing.orm.junit.ServiceRegistry;
18+
import org.hibernate.testing.orm.junit.SessionFactory;
19+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
20+
import org.hibernate.testing.orm.junit.Setting;
21+
import org.junit.jupiter.api.AfterEach;
22+
import org.junit.jupiter.api.BeforeEach;
23+
import org.junit.jupiter.api.Test;
24+
25+
import jakarta.persistence.CascadeType;
26+
import jakarta.persistence.Column;
27+
import jakarta.persistence.Entity;
28+
import jakarta.persistence.FetchType;
29+
import jakarta.persistence.GeneratedValue;
30+
import jakarta.persistence.Id;
31+
import jakarta.persistence.JoinColumn;
32+
import jakarta.persistence.ManyToOne;
33+
import jakarta.persistence.OneToMany;
34+
import jakarta.persistence.OneToOne;
35+
import jakarta.persistence.Table;
36+
37+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
38+
39+
@DomainModel(
40+
annotatedClasses = {
41+
RefreshAndBatchTest.User.class,
42+
RefreshAndBatchTest.UserInfo.class,
43+
RefreshAndBatchTest.Phone.class,
44+
}
45+
46+
)
47+
@SessionFactory
48+
@ServiceRegistry(
49+
settings = {
50+
@Setting(name = AvailableSettings.DEFAULT_BATCH_FETCH_SIZE, value = "100")
51+
52+
}
53+
)
54+
@JiraKey("HHH-18608")
55+
@BytecodeEnhanced(runNotEnhancedAsWell = true)
56+
public class RefreshAndBatchTest {
57+
58+
@BeforeEach
59+
public void setUp(SessionFactoryScope scope) {
60+
scope.inTransaction(
61+
session -> {
62+
UserInfo info = new UserInfo( "info" );
63+
Phone phone = new Phone( "123456" );
64+
info.addPhone( phone );
65+
User user = new User( 1L, "user1", info );
66+
session.persist( user );
67+
}
68+
);
69+
}
70+
71+
@AfterEach
72+
public void tearDown(SessionFactoryScope scope) {
73+
scope.inTransaction(
74+
session -> {
75+
session.createMutationQuery( "delete User" ).executeUpdate();
76+
session.createMutationQuery( "delete Phone" ).executeUpdate();
77+
session.createMutationQuery( "delete UserInfo" ).executeUpdate();
78+
}
79+
);
80+
}
81+
82+
@Test
83+
public void testRefresh(SessionFactoryScope scope) {
84+
scope.inTransaction(
85+
session -> {
86+
User user = session.createQuery( "select u from User u where u.id = :id", User.class )
87+
.setParameter( "id", 1L )
88+
.getSingleResult();
89+
assertThat( Hibernate.isInitialized( user.getInfo() ) ).isFalse();
90+
session.refresh( user.getInfo() );
91+
assertThat( Hibernate.isInitialized( user.getInfo() ) ).isTrue();
92+
}
93+
);
94+
}
95+
96+
@Entity(name = "User")
97+
@Table(name = "USER_TABLE")
98+
@BatchSize(size = 5)
99+
public static class User {
100+
101+
@Id
102+
private Long id;
103+
104+
@Column
105+
private String name;
106+
107+
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
108+
@JoinColumn(name = "INFO_ID", referencedColumnName = "ID")
109+
private UserInfo info;
110+
111+
public User() {
112+
}
113+
114+
public User(long id, String name, UserInfo info) {
115+
this.id = id;
116+
this.name = name;
117+
this.info = info;
118+
info.user = this;
119+
}
120+
121+
public long getId() {
122+
return id;
123+
}
124+
125+
public String getName() {
126+
return name;
127+
}
128+
129+
public UserInfo getInfo() {
130+
return info;
131+
}
132+
}
133+
134+
@Entity(name = "UserInfo")
135+
public static class UserInfo {
136+
@Id
137+
@GeneratedValue
138+
private Long id;
139+
140+
@OneToOne(mappedBy = "info", fetch = FetchType.LAZY)
141+
private User user;
142+
143+
private String info;
144+
145+
@OneToMany(mappedBy = "info", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
146+
private List<Phone> phoneList;
147+
148+
public long getId() {
149+
return id;
150+
}
151+
152+
public UserInfo() {
153+
}
154+
155+
public UserInfo(String info) {
156+
this.info = info;
157+
}
158+
159+
public User getUser() {
160+
return user;
161+
}
162+
163+
public String getInfo() {
164+
return info;
165+
}
166+
167+
public List<Phone> getPhoneList() {
168+
return phoneList;
169+
}
170+
171+
public void addPhone(Phone phone) {
172+
if ( phoneList == null ) {
173+
phoneList = new ArrayList<>();
174+
}
175+
this.phoneList.add( phone );
176+
phone.info = this;
177+
}
178+
}
179+
180+
@Entity(name = "Phone")
181+
public static class Phone {
182+
@Id
183+
@Column(name = "PHONE_NUMBER")
184+
private String number;
185+
186+
@ManyToOne
187+
@JoinColumn(name = "INFO_ID")
188+
private UserInfo info;
189+
190+
public Phone() {
191+
}
192+
193+
public Phone(String number) {
194+
this.number = number;
195+
}
196+
197+
public String getNumber() {
198+
return number;
199+
}
200+
201+
public UserInfo getInfo() {
202+
return info;
203+
}
204+
}
205+
}

0 commit comments

Comments
 (0)