Skip to content

Commit 8e004ee

Browse files
committed
HHH-9952 Add test showing the issue has been solved
1 parent 4fc5665 commit 8e004ee

File tree

1 file changed

+289
-0
lines changed

1 file changed

+289
-0
lines changed
Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
package org.hibernate.orm.test.formulajoin;
2+
3+
import jakarta.persistence.CascadeType;
4+
import jakarta.persistence.Embeddable;
5+
import jakarta.persistence.EmbeddedId;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.JoinColumn;
9+
import jakarta.persistence.ManyToOne;
10+
import org.hibernate.Hibernate;
11+
import org.hibernate.annotations.JoinColumnOrFormula;
12+
import org.hibernate.annotations.JoinFormula;
13+
import org.hibernate.testing.orm.junit.DomainModel;
14+
import org.hibernate.testing.orm.junit.JiraKey;
15+
import org.hibernate.testing.orm.junit.SessionFactory;
16+
import org.hibernate.testing.orm.junit.SessionFactoryScope;
17+
import org.junit.jupiter.api.AfterEach;
18+
import org.junit.jupiter.api.BeforeEach;
19+
import org.junit.jupiter.api.Test;
20+
21+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
22+
23+
@JiraKey("HHH-9952")
24+
@DomainModel(
25+
annotatedClasses = {
26+
AssociationFormulaTest.Parent.class,
27+
AssociationFormulaTest.Child.class
28+
}
29+
)
30+
@SessionFactory
31+
public class AssociationFormulaTest {
32+
33+
@BeforeEach
34+
public void setUp(SessionFactoryScope scope) {
35+
Child child = new Child( new EmbeddableId( "test", 2 ), "c1" );
36+
Parent parent = new Parent( new EmbeddableId( "test", 1 ), "p1", child );
37+
38+
Parent parent2 = new Parent( new EmbeddableId( "null", 3 ), "p2" );
39+
40+
scope.inTransaction(
41+
session -> {
42+
session.persist( parent );
43+
session.persist( parent2 );
44+
}
45+
);
46+
}
47+
48+
@AfterEach
49+
public void tearDown(SessionFactoryScope scope) {
50+
scope.getSessionFactory().getSchemaManager().truncateMappedObjects();
51+
}
52+
53+
@Test
54+
public void testJoin(SessionFactoryScope scope) {
55+
scope.inTransaction(
56+
session -> {
57+
Parent loaded = session.createQuery(
58+
"select e from Parent e inner join e.child o",
59+
Parent.class
60+
).uniqueResult();
61+
assertThat( loaded ).isNotNull();
62+
assertThat( loaded.getId().getId2() ).isEqualTo( 1 );
63+
assertThat( loaded.getChild().getId().getId2() ).isEqualTo( 2 );
64+
assertThat( Hibernate.isInitialized( loaded.getChild() ) ).isFalse();
65+
Hibernate.initialize( loaded.getChild() );
66+
}
67+
);
68+
}
69+
70+
@Test
71+
public void testJoinFetch(SessionFactoryScope scope) {
72+
scope.inTransaction(
73+
session -> {
74+
Parent loaded = session.createQuery(
75+
"select e from Parent e inner join fetch e.child o",
76+
Parent.class
77+
).uniqueResult();
78+
assertThat( loaded ).isNotNull();
79+
assertThat( loaded.getId().getId2() ).isEqualTo( 1 );
80+
assertThat( Hibernate.isInitialized( loaded.getChild() ) ).isTrue();
81+
assertThat( loaded.getChild().getId().getId2() ).isEqualTo( 2 );
82+
}
83+
);
84+
}
85+
86+
@Test
87+
public void testSelect(SessionFactoryScope scope) {
88+
scope.inTransaction(
89+
session -> {
90+
Parent loaded = session.createQuery( "from Parent e where e.child is null", Parent.class )
91+
.uniqueResult();
92+
assertThat( loaded ).isNotNull();
93+
assertThat( loaded.getId().getId2() ).isEqualTo( 3 );
94+
assertThat( loaded.getChild() ).isNull();
95+
}
96+
);
97+
98+
scope.inTransaction(
99+
session -> {
100+
Parent loaded = session.createQuery( "from Parent e where e.child.id.id2 is null", Parent.class )
101+
.uniqueResult();
102+
assertThat( loaded ).isNotNull();
103+
assertThat( loaded.getId().getId2() ).isEqualTo( 3 );
104+
assertThat( loaded.getChild() ).isNull();
105+
}
106+
);
107+
108+
scope.inTransaction(
109+
session -> {
110+
Child child = new Child( new EmbeddableId( "test", 2 ), "c2" );
111+
Parent loaded = session.createQuery( "from Parent e where e.child = :child", Parent.class )
112+
.setParameter( "child", child )
113+
.uniqueResult();
114+
assertThat( loaded ).isNotNull();
115+
assertThat( loaded.getId().getId2() ).isEqualTo( 1 );
116+
assertThat( loaded.getChild() ).isNotNull();
117+
assertThat( loaded.getChild().getId().getId2() ).isEqualTo( 2 );
118+
}
119+
);
120+
}
121+
122+
@Test
123+
public void testUpdate(SessionFactoryScope scope) {
124+
scope.inTransaction(
125+
session -> {
126+
Parent loaded = session.createQuery( "from Parent e where e.id.id2 = 1", Parent.class )
127+
.uniqueResult();
128+
assertThat( loaded ).isNotNull();
129+
assertThat( loaded.getChild() ).isNotNull();
130+
Child child = new Child( new EmbeddableId( "test", 3 ), "c3" );
131+
loaded.setChild( child );
132+
}
133+
);
134+
135+
scope.inTransaction(
136+
session -> {
137+
Parent loaded = session.createQuery( "from Parent e where e.id.id2 = 3", Parent.class )
138+
.uniqueResult();
139+
assertThat( loaded ).isNotNull();
140+
assertThat( loaded.getChild() ).isNull();
141+
Child child = new Child( new EmbeddableId( "test", 3 ), "c3" );
142+
loaded.setChild( child );
143+
}
144+
);
145+
}
146+
147+
@Test
148+
public void testDelete(SessionFactoryScope scope) {
149+
scope.inTransaction(
150+
session -> {
151+
Child child = new Child( new EmbeddableId( "test", 2 ), "c2" );
152+
assertThat(
153+
session.createMutationQuery( "delete Parent e where e.child = :child" )
154+
.setParameter( "child", child )
155+
.executeUpdate()
156+
).isEqualTo( 1 );
157+
Parent loaded = session.createQuery( "from Parent e where e.id.id2 = 1", Parent.class )
158+
.uniqueResult();
159+
assertThat( loaded ).isNull();
160+
}
161+
);
162+
}
163+
164+
// @Test
165+
// public void testUpdateHql(SessionFactoryScope scope) {
166+
// scope.inTransaction(
167+
// session -> {
168+
// Child child = new Child( new EmbeddableId( "null", 4 ), "c4" );
169+
// assertThat(
170+
// session.createQuery( "update Parent e set e.child = :child where e.id.id2 = 3" )
171+
// .setParameter( "child", child )
172+
// .executeUpdate()
173+
// ).isEqualTo( 1 );
174+
// Parent loaded = session.createQuery( "from Parent e where e.id.id2 = 3", Parent.class )
175+
// .uniqueResult();
176+
// assertThat( loaded ).isNotNull();
177+
// assertThat( loaded.getChild().getId().getId2() ).isEqualTo( 4 );
178+
// }
179+
// );
180+
// }
181+
//
182+
// @Test
183+
// public void testUpdateHqlNull(SessionFactoryScope scope) {
184+
// scope.inTransaction(
185+
// session -> {
186+
// assertThat(
187+
// session.createQuery( "update Parent e set e.child = null where e.id.id2 = 1" )
188+
// .executeUpdate()
189+
// ).isEqualTo( 1 );
190+
// Parent loaded = session.createQuery( "from Parent e where e.id.id2 = 1", Parent.class )
191+
// .uniqueResult();
192+
// assertThat( loaded ).isNotNull();
193+
// assertThat( loaded.getChild().getId().getId2() ).isEqualTo( 4 );
194+
// }
195+
// );
196+
// }
197+
198+
@Embeddable
199+
public static class EmbeddableId {
200+
private String id1;
201+
202+
private int id2;
203+
204+
public EmbeddableId() {
205+
}
206+
207+
public EmbeddableId(String id1, int id2) {
208+
this.id1 = id1;
209+
this.id2 = id2;
210+
}
211+
212+
public String getId1() {
213+
return id1;
214+
}
215+
216+
public int getId2() {
217+
return id2;
218+
}
219+
}
220+
221+
@Entity(name = "Parent")
222+
public static class Parent {
223+
@EmbeddedId
224+
private EmbeddableId id;
225+
226+
private String name;
227+
228+
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
229+
@JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "id1", value = "case when child is null then null else id1 end"))
230+
@JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "id2", name = "child"))
231+
private Child child;
232+
233+
public Parent() {
234+
}
235+
236+
public Parent(EmbeddableId id, String name) {
237+
this.id = id;
238+
this.name = name;
239+
}
240+
241+
public Parent(EmbeddableId id, String name, Child child) {
242+
this.id = id;
243+
this.name = name;
244+
this.child = child;
245+
}
246+
247+
public EmbeddableId getId() {
248+
return id;
249+
}
250+
251+
public String getName() {
252+
return name;
253+
}
254+
255+
public Child getChild() {
256+
return child;
257+
}
258+
259+
public void setChild(Child partial) {
260+
this.child = partial;
261+
}
262+
}
263+
264+
@Entity(name = "Child")
265+
public static class Child {
266+
267+
@EmbeddedId
268+
private EmbeddableId id;
269+
270+
private String name;
271+
272+
public Child() {
273+
}
274+
275+
public Child(EmbeddableId id, String name) {
276+
this.id = id;
277+
this.name = name;
278+
}
279+
280+
public String getName() {
281+
return name;
282+
}
283+
284+
public EmbeddableId getId() {
285+
return id;
286+
}
287+
}
288+
289+
}

0 commit comments

Comments
 (0)