mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-03-07 10:19:36 +00:00
HHH-18868 Test case "borrowed" from Core, slightly adapted
This commit is contained in:
parent
a83b08abc0
commit
212d4b676e
@ -0,0 +1,88 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
* Copyright Red Hat Inc. and Hibernate Authors
|
||||
*/
|
||||
package org.hibernate.processor.test.hhh18858;
|
||||
|
||||
|
||||
import jakarta.persistence.metamodel.ListAttribute;
|
||||
import jakarta.persistence.metamodel.SingularAttribute;
|
||||
import org.hibernate.processor.test.util.CompilationTest;
|
||||
import org.hibernate.processor.test.util.WithClasses;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Collection;
|
||||
|
||||
import static org.hibernate.processor.test.util.TestUtil.getFieldFromMetamodelFor;
|
||||
import static org.hibernate.processor.test.util.TestUtil.getMetaModelSourceAsString;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
public class ArrayTest extends CompilationTest {
|
||||
|
||||
@Test
|
||||
@WithClasses({Competitor.class, Contest.class})
|
||||
public void testOneToMany() throws NoSuchFieldException, IllegalAccessException {
|
||||
System.out.println( getMetaModelSourceAsString( Competitor.class ) );
|
||||
assertValidMetamodelField( Competitor.class, "id" );
|
||||
assertValidMetamodelField( Competitor.class, "name" );
|
||||
|
||||
System.out.println( getMetaModelSourceAsString( Contest.class ) );
|
||||
assertValidMetamodelField( Contest.class, "id" );
|
||||
assertValidMetamodelField( Contest.class, "results" );
|
||||
assertValidMetamodelField( Contest.class, "heldIn" );
|
||||
}
|
||||
|
||||
private void assertValidMetamodelField(Class<?> entityClass, String fieldName)
|
||||
throws NoSuchFieldException, IllegalAccessException {
|
||||
final Field entityField = entityClass.getDeclaredField( fieldName );
|
||||
final Class<?> entityFieldType = entityField.getType();
|
||||
|
||||
final Field modelField = getFieldFromMetamodelFor( entityClass, fieldName );
|
||||
final Type modelFieldGenericType = modelField.getGenericType();
|
||||
if ( modelFieldGenericType instanceof ParameterizedType parametrized ) {
|
||||
final Type[] typeArguments = parametrized.getActualTypeArguments();
|
||||
assertEquals( 2, typeArguments.length );
|
||||
assertEquals( entityClass, typeArguments[0] );
|
||||
if ( Collection.class.isAssignableFrom( entityFieldType ) || entityFieldType.isArray() ) {
|
||||
assertEquals( ListAttribute.class, parametrized.getRawType() );
|
||||
if ( Collection.class.isAssignableFrom( entityFieldType ) ) {
|
||||
final ParameterizedType entityFieldGenericType = (ParameterizedType) entityField.getGenericType();
|
||||
assertEquals( entityFieldGenericType.getActualTypeArguments()[0], typeArguments[1] );
|
||||
}
|
||||
else if ( entityFieldType.getComponentType().isPrimitive() ) {
|
||||
assertEquals(
|
||||
entityFieldType.getComponentType(),
|
||||
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
|
||||
);
|
||||
}
|
||||
else {
|
||||
assertEquals( entityFieldType.getComponentType(), typeArguments[1] );
|
||||
}
|
||||
}
|
||||
else {
|
||||
assertEquals( SingularAttribute.class, parametrized.getRawType() );
|
||||
if ( entityFieldType.isPrimitive() ) {
|
||||
assertEquals(
|
||||
entityFieldType,
|
||||
((Class) typeArguments[1]).getDeclaredField( "TYPE" ).get( null )
|
||||
);
|
||||
}
|
||||
else {
|
||||
assertEquals( entityFieldType, typeArguments[1] );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Assertions.fail();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
* Copyright Red Hat Inc. and Hibernate Authors
|
||||
*/
|
||||
package org.hibernate.processor.test.hhh18858;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Competitor {
|
||||
private int id;
|
||||
private String name;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
* Copyright Red Hat Inc. and Hibernate Authors
|
||||
*/
|
||||
package org.hibernate.processor.test.hhh18858;
|
||||
|
||||
import jakarta.persistence.CascadeType;
|
||||
import jakarta.persistence.ElementCollection;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.GeneratedValue;
|
||||
import jakarta.persistence.Id;
|
||||
import jakarta.persistence.OneToMany;
|
||||
import jakarta.persistence.OrderColumn;
|
||||
|
||||
import org.hibernate.annotations.ListIndexBase;
|
||||
|
||||
/**
|
||||
* @author Emmanuel Bernard
|
||||
*/
|
||||
@Entity
|
||||
public class Contest {
|
||||
private int id;
|
||||
private Competitor[] results;
|
||||
private int[] heldIn;
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@OneToMany(cascade = CascadeType.ALL)
|
||||
@OrderColumn(name = "pos")
|
||||
public Competitor[] getResults() {
|
||||
return results;
|
||||
}
|
||||
|
||||
public void setResults(Competitor[] results) {
|
||||
this.results = results;
|
||||
}
|
||||
|
||||
@ElementCollection
|
||||
@OrderColumn
|
||||
@ListIndexBase( 1 )
|
||||
public int[] getHeldIn() {
|
||||
return heldIn;
|
||||
}
|
||||
|
||||
public void setHeldIn(int[] heldIn) {
|
||||
this.heldIn = heldIn;
|
||||
}
|
||||
|
||||
/*public enum Month {
|
||||
January, February, March, April, May, June, July, August, September, October, November, December;
|
||||
};*/
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user