Skip to content

Commit 148995c

Browse files
cigalybeikov
authored andcommitted
HHH-18858 Test case "borrowed" from Core, slightly adapted
1 parent 3635a49 commit 148995c

File tree

3 files changed

+190
-0
lines changed

3 files changed

+190
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.processor.test.hhh18858;
8+
9+
10+
import jakarta.persistence.metamodel.ListAttribute;
11+
import jakarta.persistence.metamodel.SingularAttribute;
12+
import org.hibernate.processor.test.util.CompilationTest;
13+
import org.hibernate.processor.test.util.WithClasses;
14+
import org.junit.Test;
15+
import org.junit.jupiter.api.Assertions;
16+
17+
import java.lang.reflect.Field;
18+
import java.lang.reflect.ParameterizedType;
19+
import java.lang.reflect.Type;
20+
import java.util.Collection;
21+
22+
import static org.hibernate.processor.test.util.TestUtil.getFieldFromMetamodelFor;
23+
import static org.hibernate.processor.test.util.TestUtil.getMetaModelSourceAsString;
24+
import static org.junit.jupiter.api.Assertions.assertEquals;
25+
26+
/**
27+
* @author Emmanuel Bernard
28+
*/
29+
public class ArrayTest extends CompilationTest {
30+
31+
@Test
32+
@WithClasses({Competitor.class, Contest.class})
33+
public void testOneToMany() throws NoSuchFieldException, IllegalAccessException {
34+
System.out.println( getMetaModelSourceAsString( Competitor.class ) );
35+
assertValidMetamodelField( Competitor.class, "id" );
36+
assertValidMetamodelField( Competitor.class, "name" );
37+
38+
System.out.println( getMetaModelSourceAsString( Contest.class ) );
39+
assertValidMetamodelField( Contest.class, "id" );
40+
assertValidMetamodelField( Contest.class, "results" );
41+
assertValidMetamodelField( Contest.class, "heldIn" );
42+
}
43+
44+
private void assertValidMetamodelField(Class<?> entityClass, String fieldName)
45+
throws NoSuchFieldException, IllegalAccessException {
46+
final Field entityField = entityClass.getDeclaredField( fieldName );
47+
final Class<?> entityFieldType = entityField.getType();
48+
49+
final Field modelField = getFieldFromMetamodelFor( entityClass, fieldName );
50+
final Type modelFieldGenericType = modelField.getGenericType();
51+
if (modelFieldGenericType instanceof ParameterizedType) {
52+
ParameterizedType parametrized = (ParameterizedType) modelFieldGenericType;
53+
final Type[] typeArguments = parametrized.getActualTypeArguments();
54+
assertEquals( 2, typeArguments.length );
55+
assertEquals( entityClass, typeArguments[0] );
56+
if ( Collection.class.isAssignableFrom( entityFieldType ) || entityFieldType.isArray() ) {
57+
assertEquals( ListAttribute.class, parametrized.getRawType() );
58+
if ( Collection.class.isAssignableFrom( entityFieldType ) ) {
59+
final ParameterizedType entityFieldGenericType = (ParameterizedType) entityField.getGenericType();
60+
assertEquals( entityFieldGenericType.getActualTypeArguments()[0], typeArguments[1] );
61+
}
62+
else if ( entityFieldType.getComponentType().isPrimitive() ) {
63+
assertEquals(
64+
entityFieldType.getComponentType(),
65+
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
66+
);
67+
}
68+
else {
69+
assertEquals( entityFieldType.getComponentType(), typeArguments[1] );
70+
}
71+
}
72+
else {
73+
assertEquals( SingularAttribute.class, parametrized.getRawType() );
74+
if ( entityFieldType.isPrimitive() ) {
75+
assertEquals(
76+
entityFieldType,
77+
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
78+
);
79+
}
80+
else {
81+
assertEquals( entityFieldType, typeArguments[1] );
82+
}
83+
}
84+
}
85+
else {
86+
Assertions.fail();
87+
}
88+
89+
}
90+
91+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.processor.test.hhh18858;
8+
import jakarta.persistence.Entity;
9+
import jakarta.persistence.GeneratedValue;
10+
import jakarta.persistence.Id;
11+
12+
/**
13+
* @author Emmanuel Bernard
14+
*/
15+
@Entity
16+
public class Competitor {
17+
private int id;
18+
private String name;
19+
20+
public String getName() {
21+
return name;
22+
}
23+
24+
public void setName(String name) {
25+
this.name = name;
26+
}
27+
28+
@Id
29+
@GeneratedValue
30+
public int getId() {
31+
return id;
32+
}
33+
34+
public void setId(int id) {
35+
this.id = id;
36+
}
37+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.processor.test.hhh18858;
8+
9+
import jakarta.persistence.CascadeType;
10+
import jakarta.persistence.ElementCollection;
11+
import jakarta.persistence.Entity;
12+
import jakarta.persistence.GeneratedValue;
13+
import jakarta.persistence.Id;
14+
import jakarta.persistence.OneToMany;
15+
import jakarta.persistence.OrderColumn;
16+
17+
import org.hibernate.annotations.ListIndexBase;
18+
19+
/**
20+
* @author Emmanuel Bernard
21+
*/
22+
@Entity
23+
public class Contest {
24+
private int id;
25+
private Competitor[] results;
26+
private int[] heldIn;
27+
28+
@Id
29+
@GeneratedValue
30+
public int getId() {
31+
return id;
32+
}
33+
34+
public void setId(int id) {
35+
this.id = id;
36+
}
37+
38+
@OneToMany(cascade = CascadeType.ALL)
39+
@OrderColumn(name = "pos")
40+
public Competitor[] getResults() {
41+
return results;
42+
}
43+
44+
public void setResults(Competitor[] results) {
45+
this.results = results;
46+
}
47+
48+
@ElementCollection
49+
@OrderColumn
50+
@ListIndexBase( 1 )
51+
public int[] getHeldIn() {
52+
return heldIn;
53+
}
54+
55+
public void setHeldIn(int[] heldIn) {
56+
this.heldIn = heldIn;
57+
}
58+
59+
/*public enum Month {
60+
January, February, March, April, May, June, July, August, September, October, November, December;
61+
};*/
62+
}

0 commit comments

Comments
 (0)