HHH-12612 - Fix JDK9 compatibility with TYPE_USE on collection fields.

This commit is contained in:
Chris Cranford 2018-05-22 09:07:21 -04:00
parent 895b0bb75d
commit 45a3b39c40
3 changed files with 146 additions and 1 deletions

View File

@ -121,7 +121,14 @@ public final class TypeUtils {
return extractClosestRealTypeAsString( compositeUpperBound, context ); return extractClosestRealTypeAsString( compositeUpperBound, context );
} }
else { else {
return context.getTypeUtils().erasure( type ).toString(); final TypeMirror erasureType = context.getTypeUtils().erasure( type );
if ( TypeKind.ARRAY.equals( erasureType.getKind() ) ) {
// keep old behavior here for arrays since #asElement returns null for them.
return erasureType.toString();
}
else {
return context.getTypeUtils().asElement( erasureType ).toString();
}
} }
} }

View File

@ -0,0 +1,58 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.jpamodelgen.test.elementcollection;
import org.hibernate.jpamodelgen.test.util.CompilationTest;
import org.hibernate.jpamodelgen.test.util.TestForIssue;
import org.hibernate.jpamodelgen.test.util.WithClasses;
import org.junit.Test;
import static org.hibernate.jpamodelgen.test.util.TestUtil.assertListAttributeTypeInMetaModelFor;
import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMapAttributesInMetaModelFor;
import static org.hibernate.jpamodelgen.test.util.TestUtil.assertMetamodelClassGeneratedFor;
import static org.hibernate.jpamodelgen.test.util.TestUtil.assertSetAttributeTypeInMetaModelFor;
/**
* @author Chris Cranford
*/
public class ElementCollectionTypeUseTest extends CompilationTest {
@Test
@TestForIssue(jiraKey = "HHH-12612")
@WithClasses(OfficeBuildingValidated.class)
public void testAnnotatedCollectionElements() {
assertMetamodelClassGeneratedFor( OfficeBuildingValidated.class );
assertMapAttributesInMetaModelFor(
OfficeBuildingValidated.class,
"doorCodes",
Integer.class,
byte[].class,
"Wrong type in map attributes."
);
assertSetAttributeTypeInMetaModelFor(
OfficeBuildingValidated.class,
"computerSerialNumbers",
String.class,
"Wrong type in set attribute."
);
assertListAttributeTypeInMetaModelFor(
OfficeBuildingValidated.class,
"employeeNames",
String.class,
"Wrong type in list attributes."
);
assertListAttributeTypeInMetaModelFor(
OfficeBuildingValidated.class,
"rooms",
Room.class,
"Wrong type in list attributes."
);
}
}

View File

@ -0,0 +1,80 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.jpamodelgen.test.elementcollection;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
/**
* @author Chris Cranford
*/
@Entity
public class OfficeBuildingValidated {
// mock a bean validation annotation using TYPE_USE
@Target({ ElementType.TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNullAllowed {
}
@ElementCollection
@NotNullAllowed
private Map<@NotNullAllowed Integer, @NotNullAllowed byte[]> doorCodes;
@ElementCollection
@NotNullAllowed
private Set<@NotNullAllowed String> computerSerialNumbers;
@ElementCollection
@NotNullAllowed
private List<@NotNullAllowed String> employeeNames;
@ElementCollection
@NotNullAllowed
private List<@NotNullAllowed Room> rooms;
public Map<Integer, byte[]> getDoorCodes() {
return doorCodes;
}
public void setDoorCodes(Map<Integer, byte[]> doorCodes) {
this.doorCodes = doorCodes;
}
public Set<String> getComputerSerialNumbers() {
return computerSerialNumbers;
}
public void setComputerSerialNumbers(Set<String> computerSerialNumbers) {
this.computerSerialNumbers = computerSerialNumbers;
}
public List<String> getEmployeeNames() {
return employeeNames;
}
public void setEmployeeNames(List<String> employeeNames) {
this.employeeNames = employeeNames;
}
public List<Room> getRooms() {
return rooms;
}
public void setRooms(List<Room> rooms) {
this.rooms = rooms;
}
}