Skip to content

Commit 212d4b6

Browse files
cigalygavinking
authored andcommitted
HHH-18868 Test case "borrowed" from Core, slightly adapted
1 parent a83b08a commit 212d4b6

File tree

3 files changed

+183
-0
lines changed

3 files changed

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

0 commit comments

Comments
 (0)