Skip to content

Commit b26441a

Browse files
committed
HHH-18713 Add test for issue
1 parent 2e3b9d5 commit b26441a

File tree

1 file changed

+242
-0
lines changed
  • hibernate-core/src/test/java/org/hibernate/orm/test/bytecode/enhancement/saveupdate

1 file changed

+242
-0
lines changed
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
package org.hibernate.orm.test.bytecode.enhancement.saveupdate;
2+
3+
import java.util.ArrayList;
4+
import java.util.LinkedHashSet;
5+
import java.util.List;
6+
import java.util.Set;
7+
8+
import org.hibernate.testing.bytecode.enhancement.extension.BytecodeEnhanced;
9+
import org.hibernate.testing.orm.junit.DomainModel;
10+
import org.hibernate.testing.orm.junit.JiraKey;
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.Test;
15+
16+
import jakarta.persistence.CascadeType;
17+
import jakarta.persistence.Column;
18+
import jakarta.persistence.Entity;
19+
import jakarta.persistence.GeneratedValue;
20+
import jakarta.persistence.Id;
21+
import jakarta.persistence.ManyToOne;
22+
import jakarta.persistence.OneToMany;
23+
import jakarta.persistence.Version;
24+
25+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
26+
27+
@DomainModel(
28+
annotatedClasses = {
29+
SaveUpdateTest.Parent.class,
30+
SaveUpdateTest.Child.class,
31+
SaveUpdateTest.Owned.class,
32+
SaveUpdateTest.Owner.class,
33+
}
34+
)
35+
@SessionFactory
36+
@BytecodeEnhanced(runNotEnhancedAsWell = true)
37+
public class SaveUpdateTest {
38+
39+
@AfterEach
40+
public void tearDown(SessionFactoryScope scope) {
41+
scope.inTransaction(
42+
session -> {
43+
session.createQuery( "delete from Child" ).executeUpdate();
44+
session.createQuery( "delete from Parent" ).executeUpdate();
45+
}
46+
);
47+
}
48+
49+
@Test
50+
@JiraKey("HHH-18713")
51+
public void testSaveUpdate(SessionFactoryScope scope) {
52+
Parent parent = scope.fromTransaction(
53+
session -> {
54+
Parent p = new Parent( "a" );
55+
Child child = new Child( p, "b" );
56+
session.persist( p );
57+
return p;
58+
59+
}
60+
);
61+
62+
scope.inTransaction( session -> {
63+
Child child2 = new Child( parent, "c" );
64+
session.saveOrUpdate( parent );
65+
} );
66+
67+
scope.inTransaction( session -> {
68+
Parent saved = session.get( Parent.class, parent.getId() );
69+
assertThat( saved.getChildren().size() ).isEqualTo( 2 );
70+
} );
71+
}
72+
73+
@Test
74+
@JiraKey("HHH-18614")
75+
public void testUpdate(SessionFactoryScope scope) {
76+
Parent parent = scope.fromTransaction(
77+
session -> {
78+
Parent p = new Parent( "a" );
79+
Child child = new Child( p, "b" );
80+
session.persist( p );
81+
return p;
82+
83+
}
84+
);
85+
86+
scope.inTransaction( session -> {
87+
Child child2 = new Child( parent, "c" );
88+
session.update( parent );
89+
} );
90+
91+
scope.inTransaction( session -> {
92+
Parent saved = session.get( Parent.class, parent.getId() );
93+
assertThat( saved.getChildren().size() ).isEqualTo( 2 );
94+
} );
95+
}
96+
97+
@Test
98+
@JiraKey("HHH-18614")
99+
void testUpdate2(SessionFactoryScope scope) {
100+
Long ownerId = scope.fromTransaction( session -> {
101+
Owner owner = new Owner( "a" );
102+
owner.addOwned( new Owned() );
103+
session.persist( owner );
104+
return owner.getId();
105+
} );
106+
107+
scope.inTransaction( session -> {
108+
Owner owner2 = new Owner( ownerId, "a" );
109+
owner2.addOwned( new Owned() );
110+
session.update( owner2 );
111+
session.flush();
112+
} );
113+
}
114+
115+
@Test
116+
@JiraKey("HHH-18614")
117+
void testUpdate3(SessionFactoryScope scope) {
118+
Long ownerId = scope.fromTransaction( session -> {
119+
Owner owner = new Owner( );
120+
owner.addOwned( new Owned() );
121+
session.persist( owner );
122+
return owner.getId();
123+
} );
124+
125+
scope.inTransaction( session -> {
126+
Owner owner2 = new Owner( );
127+
owner2.id = ownerId;
128+
owner2.owneds.add( new Owned() );
129+
session.update( owner2 );
130+
session.flush();
131+
} );
132+
}
133+
134+
@Entity(name = "Parent")
135+
public static class Parent {
136+
137+
@Id
138+
@GeneratedValue
139+
public Long id;
140+
141+
public Long getId() {
142+
return id;
143+
}
144+
145+
private String name;
146+
147+
@Version
148+
@Column(name = "VERSION_COLUMN")
149+
private long version;
150+
151+
public Parent() {
152+
}
153+
154+
public Parent(String name) {
155+
this.name = name;
156+
}
157+
158+
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
159+
private Set<Child> children = new LinkedHashSet<>();
160+
161+
public Set<Child> getChildren() {
162+
return children;
163+
}
164+
}
165+
166+
@Entity(name = "Child")
167+
public static class Child {
168+
169+
@Id
170+
@GeneratedValue
171+
public Long id;
172+
173+
public Long getId() {
174+
return id;
175+
}
176+
177+
@ManyToOne
178+
private Parent parent;
179+
180+
private String name;
181+
182+
public Child() {
183+
}
184+
185+
public Child(Parent parent, String name) {
186+
this.parent = parent;
187+
parent.children.add( this );
188+
this.name = name;
189+
}
190+
}
191+
192+
@Entity(name = "Owned")
193+
public static class Owned {
194+
195+
@Id
196+
@GeneratedValue
197+
private Long id;
198+
199+
private String name;
200+
201+
public Owned() {
202+
}
203+
204+
public Owned(String name) {
205+
this.name = name;
206+
}
207+
}
208+
209+
@Entity(name = "Owner")
210+
public static class Owner {
211+
212+
@Id
213+
@GeneratedValue
214+
private Long id;
215+
216+
private String name;
217+
218+
@OneToMany(cascade = CascadeType.ALL)
219+
private List<Owned> owneds = new ArrayList<>();
220+
221+
public Owner() {
222+
}
223+
224+
public Owner(String name) {
225+
this.name = name;
226+
}
227+
228+
public Owner(Long id, String name) {
229+
this.id = id;
230+
this.name = name;
231+
}
232+
233+
public void addOwned(Owned owned) {
234+
owneds.add( owned );
235+
}
236+
237+
public Long getId() {
238+
return id;
239+
}
240+
}
241+
242+
}

0 commit comments

Comments
 (0)