Skip to content

Commit a0b1146

Browse files
committed
HHH-18868 Test case "borrowed" from Core, slightly adapted
1 parent cbad5bf commit a0b1146

File tree

3 files changed

+182
-0
lines changed

3 files changed

+182
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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.jupiter.api.Assertions;
13+
14+
import java.lang.reflect.Field;
15+
import java.lang.reflect.ParameterizedType;
16+
import java.lang.reflect.Type;
17+
import java.util.Collection;
18+
19+
import static org.hibernate.processor.test.util.TestUtil.getFieldFromMetamodelFor;
20+
import static org.hibernate.processor.test.util.TestUtil.getMetaModelSourceAsString;
21+
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
23+
/**
24+
* @author Emmanuel Bernard
25+
*/
26+
public class ArrayTest extends CompilationTest {
27+
28+
@org.junit.Test
29+
@WithClasses({Competitor.class, Contest.class})
30+
public void testOneToMany() throws NoSuchFieldException, IllegalAccessException {
31+
System.out.println( getMetaModelSourceAsString( Competitor.class ) );
32+
assertValidMetamodelField( Competitor.class, "id" );
33+
assertValidMetamodelField( Competitor.class, "name" );
34+
35+
System.out.println( getMetaModelSourceAsString( Contest.class ) );
36+
assertValidMetamodelField( Contest.class, "id" );
37+
assertValidMetamodelField( Contest.class, "results" );
38+
assertValidMetamodelField( Contest.class, "heldIn" );
39+
}
40+
41+
private void assertValidMetamodelField(Class<?> entityClass, String fieldName)
42+
throws NoSuchFieldException, IllegalAccessException {
43+
final Field entityField = entityClass.getDeclaredField( fieldName );
44+
final Class<?> entityFieldType = entityField.getType();
45+
46+
final Field modelField = getFieldFromMetamodelFor( entityClass, fieldName );
47+
final Type modelFieldGenericType = modelField.getGenericType();
48+
if ( modelFieldGenericType instanceof ParameterizedType parametrized ) {
49+
final Type[] typeArguments = parametrized.getActualTypeArguments();
50+
assertEquals( 2, typeArguments.length );
51+
assertEquals( entityClass, typeArguments[0] );
52+
if ( entityFieldType.isAssignableFrom( Collection.class ) || entityFieldType.isArray() ) {
53+
assertEquals( ListAttribute.class, parametrized.getRawType() );
54+
if ( entityFieldType.isAssignableFrom( Collection.class ) ) {
55+
final ParameterizedType entityFieldGenericType = (ParameterizedType) entityField.getGenericType();
56+
assertEquals( entityFieldGenericType.getActualTypeArguments()[0], typeArguments[1] );
57+
}
58+
else if ( entityFieldType.getComponentType().isPrimitive() ) {
59+
assertEquals(
60+
entityFieldType.getComponentType(),
61+
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
62+
);
63+
}
64+
else {
65+
assertEquals( entityFieldType.getComponentType(), typeArguments[1] );
66+
}
67+
}
68+
else {
69+
assertEquals( SingularAttribute.class, parametrized.getRawType() );
70+
if ( entityFieldType.isPrimitive() ) {
71+
assertEquals(
72+
entityFieldType,
73+
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
74+
);
75+
}
76+
else {
77+
assertEquals( entityFieldType, typeArguments[1] );
78+
}
79+
}
80+
}
81+
else {
82+
Assertions.fail();
83+
}
84+
85+
}
86+
87+
}
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)