Skip to content

Commit fcba4ed

Browse files
leonschenkbeikov
authored andcommitted
HHH-18675: Testcase added to Hibernate Project includes a reference testcase without generics.
1 parent 6ecc2a6 commit fcba4ed

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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.manytomany.generic;
6+
7+
import jakarta.persistence.CascadeType;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.FetchType;
10+
import jakarta.persistence.GeneratedValue;
11+
import jakarta.persistence.GenerationType;
12+
import jakarta.persistence.Id;
13+
import jakarta.persistence.JoinColumn;
14+
import jakarta.persistence.JoinTable;
15+
import jakarta.persistence.ManyToMany;
16+
import jakarta.persistence.ManyToOne;
17+
import jakarta.persistence.OneToMany;
18+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
19+
import org.hibernate.testing.orm.junit.Jpa;
20+
import org.junit.jupiter.api.Test;
21+
22+
import java.util.HashSet;
23+
import java.util.List;
24+
import java.util.Set;
25+
import java.util.UUID;
26+
27+
import static org.hamcrest.MatcherAssert.assertThat;
28+
import static org.hamcrest.Matchers.*;
29+
30+
@Jpa(
31+
annotatedClasses = {
32+
ManyToManyGenericTest.NodeTree.class,
33+
ManyToManyGenericTest.GenericNode.class
34+
}
35+
)
36+
public class ManyToManyGenericTest {
37+
38+
@Test
39+
void testSelfReferencingGeneric(final EntityManagerFactoryScope scope) {
40+
final UUID treeId = scope.fromTransaction(em -> {
41+
final NodeTree tree = new NodeTree();
42+
final GenericNode<?> root = new GenericNode<>();
43+
root.tree = tree;
44+
final GenericNode<?> branch = new GenericNode<>();
45+
branch.tree = tree;
46+
tree.nodes.add(root);
47+
tree.nodes.add(branch);
48+
root.children.add(branch);
49+
em.persist(tree);
50+
return tree.id;
51+
});
52+
53+
final NodeTree nodeTree = scope.fromEntityManager(em -> em.find(NodeTree.class, treeId));
54+
55+
assertThat(nodeTree, is(notNullValue()));
56+
assertThat(nodeTree.id, is(treeId));
57+
assertThat(nodeTree.nodes, iterableWithSize(2));
58+
assertThat(nodeTree.nodes, containsInAnyOrder(List.of(
59+
hasProperty("children", iterableWithSize(1)),
60+
hasProperty("children", emptyIterable())
61+
)));
62+
}
63+
64+
@Entity(name = "tree")
65+
public static class NodeTree {
66+
@Id
67+
@GeneratedValue(strategy = GenerationType.UUID)
68+
public UUID id;
69+
70+
@OneToMany(mappedBy = "tree", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
71+
public Set<GenericNode<?>> nodes = new HashSet<>();
72+
}
73+
74+
@Entity(name = "node")
75+
public static class GenericNode<T> {
76+
77+
@Id
78+
@GeneratedValue(strategy = GenerationType.UUID)
79+
public UUID id;
80+
81+
@ManyToOne(optional = false)
82+
@JoinColumn(name = "TREE_ID")
83+
public NodeTree tree;
84+
85+
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.DETACH})
86+
@JoinTable(name = "NODE_CHILDREN",
87+
joinColumns = {@JoinColumn(name = "TREE_ID", referencedColumnName = "TREE_ID"), @JoinColumn(name = "NODE_ID", referencedColumnName = "ID")},
88+
inverseJoinColumns = {@JoinColumn(name = "CHILD_ID", referencedColumnName = "ID")}
89+
)
90+
private final Set<GenericNode<?>> children = new HashSet<>();
91+
92+
public Set<GenericNode<?>> getChildren() {
93+
return children;
94+
}
95+
}
96+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
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.manytomany.generic;
6+
7+
import jakarta.persistence.CascadeType;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.FetchType;
10+
import jakarta.persistence.GeneratedValue;
11+
import jakarta.persistence.GenerationType;
12+
import jakarta.persistence.Id;
13+
import jakarta.persistence.JoinColumn;
14+
import jakarta.persistence.JoinTable;
15+
import jakarta.persistence.ManyToMany;
16+
import jakarta.persistence.ManyToOne;
17+
import jakarta.persistence.OneToMany;
18+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
19+
import org.hibernate.testing.orm.junit.Jpa;
20+
import org.junit.jupiter.api.Test;
21+
22+
import java.util.HashSet;
23+
import java.util.List;
24+
import java.util.Set;
25+
import java.util.UUID;
26+
27+
import static org.hamcrest.MatcherAssert.assertThat;
28+
import static org.hamcrest.Matchers.containsInAnyOrder;
29+
import static org.hamcrest.Matchers.emptyIterable;
30+
import static org.hamcrest.Matchers.hasProperty;
31+
import static org.hamcrest.Matchers.is;
32+
import static org.hamcrest.Matchers.iterableWithSize;
33+
import static org.hamcrest.Matchers.notNullValue;
34+
35+
@Jpa(
36+
annotatedClasses = {
37+
ManyToManyNonGenericTest.NodeTree.class,
38+
ManyToManyNonGenericTest.Node.class
39+
}
40+
)
41+
public class ManyToManyNonGenericTest {
42+
43+
@Test
44+
void testSelfReferencingGeneric(final EntityManagerFactoryScope scope) {
45+
final UUID treeId = scope.fromTransaction(em -> {
46+
final NodeTree tree = new NodeTree();
47+
final Node root = new Node();
48+
root.tree = tree;
49+
final Node branch = new Node();
50+
branch.tree = tree;
51+
tree.nodes.add(root);
52+
tree.nodes.add(branch);
53+
root.children.add(branch);
54+
em.persist(tree);
55+
return tree.id;
56+
});
57+
58+
final NodeTree nodeTree = scope.fromEntityManager(em -> em.find(NodeTree.class, treeId));
59+
60+
assertThat(nodeTree, is(notNullValue()));
61+
assertThat(nodeTree.id, is(treeId));
62+
assertThat(nodeTree.nodes, iterableWithSize(2));
63+
assertThat(nodeTree.nodes, containsInAnyOrder(List.of(
64+
hasProperty("children", iterableWithSize(1)),
65+
hasProperty("children", emptyIterable())
66+
)));
67+
}
68+
69+
@Entity(name = "tree")
70+
public static class NodeTree {
71+
@Id
72+
@GeneratedValue(strategy = GenerationType.UUID)
73+
public UUID id;
74+
75+
@OneToMany(mappedBy = "tree", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
76+
public Set<Node> nodes = new HashSet<>();
77+
}
78+
79+
@Entity(name = "node")
80+
public static class Node {
81+
82+
@Id
83+
@GeneratedValue(strategy = GenerationType.UUID)
84+
public UUID id;
85+
86+
@ManyToOne(optional = false)
87+
@JoinColumn(name = "TREE_ID")
88+
public NodeTree tree;
89+
90+
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.DETACH})
91+
@JoinTable(name = "NODE_CHILDREN",
92+
joinColumns = {@JoinColumn(name = "TREE_ID", referencedColumnName = "TREE_ID"), @JoinColumn(name = "NODE_ID", referencedColumnName = "ID")},
93+
inverseJoinColumns = {@JoinColumn(name = "CHILD_ID", referencedColumnName = "ID")}
94+
)
95+
private final Set<Node> children = new HashSet<>();
96+
97+
public Set<Node> getChildren() {
98+
return children;
99+
}
100+
101+
@Override
102+
public String toString() {
103+
return "node [%s] parent of %s".formatted(id, children.stream().map(n -> n.id).toList());
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)