Skip to content

Commit

Permalink
Fix Attribute#getJavaType() returs also primitive types
Browse files Browse the repository at this point in the history
  • Loading branch information
dreab8 committed Feb 7, 2022
1 parent a25758f commit 768e687
Show file tree
Hide file tree
Showing 11 changed files with 105 additions and 19 deletions.
Expand Up @@ -44,6 +44,7 @@
import org.hibernate.metamodel.model.domain.internal.EntityTypeImpl;
import org.hibernate.metamodel.model.domain.internal.MappedSuperclassTypeImpl;
import org.hibernate.metamodel.model.domain.internal.MappingMetamodelImpl;
import org.hibernate.metamodel.model.domain.internal.PrimitiveBasicTypeImpl;
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
import org.hibernate.type.descriptor.java.JavaType;
import org.hibernate.type.descriptor.java.spi.EntityJavaType;
Expand Down Expand Up @@ -702,9 +703,11 @@ public <J> BasicDomainType<J> resolveBasicType(Class<J> javaType) {
return (BasicDomainType<J>) basicDomainTypeMap.computeIfAbsent(
javaType,
jt -> {
final JavaTypeRegistry registry =
getTypeConfiguration()
.getJavaTypeRegistry();
final JavaTypeRegistry registry = getTypeConfiguration().getJavaTypeRegistry();

if ( javaType.isPrimitive() ) {
return new PrimitiveBasicTypeImpl<>( registry.resolveDescriptor( javaType ), javaType );
}
return new BasicTypeImpl<>( registry.resolveDescriptor( javaType ) );
}
);
Expand Down
Expand Up @@ -17,7 +17,6 @@
import org.hibernate.metamodel.model.domain.DomainType;
import org.hibernate.metamodel.model.domain.ManagedDomainType;
import org.hibernate.metamodel.model.domain.PersistentAttribute;
import org.hibernate.metamodel.model.domain.SimpleDomainType;
import org.hibernate.type.descriptor.java.JavaType;

/**
Expand Down Expand Up @@ -61,6 +60,9 @@ public String getName() {

@Override
public Class<J> getJavaType() {
if ( valueType instanceof BasicTypeImpl ) {
return ( (BasicTypeImpl) valueType ).getJavaType();
}
return attributeJtd.getJavaTypeClass();
}

Expand Down
Expand Up @@ -35,6 +35,7 @@ public JavaType<J> getExpressibleJavaType() {
return javaType;
}

@Override
public Class<J> getJavaType() {
return this.getExpressibleJavaType().getJavaTypeClass();
}
Expand Down
@@ -0,0 +1,24 @@
/*
* 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.metamodel.model.domain.internal;

import org.hibernate.type.descriptor.java.JavaType;

public class PrimitiveBasicTypeImpl<J> extends BasicTypeImpl<J> {
private final Class<J> javaTypeClass;

public PrimitiveBasicTypeImpl(JavaType<J> javaType, Class<J> javaTypeClass) {
super( javaType );
assert javaTypeClass.isPrimitive();
this.javaTypeClass = javaTypeClass;
}

@Override
public Class<J> getJavaType() {
return javaTypeClass;
}
}
Expand Up @@ -108,7 +108,7 @@ public SimpleDomainType<J> getType() {

@Override
public Class<J> getBindableJavaType() {
return getExpressibleJavaType().getJavaTypeClass();
return getJavaType();
}

@Override
Expand Down
Expand Up @@ -22,10 +22,10 @@
*
* @author Steve Ebersole
*/
public class FloatTypeDescriptor extends AbstractClassJavaType<Float> implements PrimitiveJavaType<Float> {
public static final FloatTypeDescriptor INSTANCE = new FloatTypeDescriptor();
public class FloatJavaType extends AbstractClassJavaType<Float> implements PrimitiveJavaType<Float> {
public static final FloatJavaType INSTANCE = new FloatJavaType();

public FloatTypeDescriptor() {
public FloatJavaType() {
super( Float.class );
}

Expand Down
Expand Up @@ -45,7 +45,7 @@
import org.hibernate.type.descriptor.java.DateJavaType;
import org.hibernate.type.descriptor.java.DoubleJavaType;
import org.hibernate.type.descriptor.java.DurationJavaType;
import org.hibernate.type.descriptor.java.FloatTypeDescriptor;
import org.hibernate.type.descriptor.java.FloatJavaType;
import org.hibernate.type.descriptor.java.InetAddressJavaType;
import org.hibernate.type.descriptor.java.InstantJavaType;
import org.hibernate.type.descriptor.java.IntegerJavaType;
Expand Down Expand Up @@ -104,7 +104,7 @@ public static void prime(BaselineTarget target) {
primePrimitive( target, ShortJavaType.INSTANCE );
primePrimitive( target, IntegerJavaType.INSTANCE );
primePrimitive( target, LongJavaType.INSTANCE );
primePrimitive( target, FloatTypeDescriptor.INSTANCE );
primePrimitive( target, FloatJavaType.INSTANCE );
primePrimitive( target, DoubleJavaType.INSTANCE );

target.addBaselineDescriptor( ObjectJavaType.INSTANCE );
Expand Down
@@ -0,0 +1,55 @@
/*
* 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.orm.test.jpa.compliance;

import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
import org.hibernate.testing.orm.junit.Jpa;
import org.junit.jupiter.api.Test;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.metamodel.Attribute;
import jakarta.persistence.metamodel.ManagedType;
import jakarta.persistence.metamodel.Metamodel;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

@Jpa(
annotatedClasses = GetJavaTypeTest.Person.class
)
public class GetJavaTypeTest {

@Test
public void getJavaType(EntityManagerFactoryScope scope) {
scope.inEntityManager(
entityManager -> {
Metamodel metaModel = entityManager.getMetamodel();
if ( metaModel != null ) {
ManagedType<Person> mTypeOrder = metaModel.managedType( Person.class );
assertNotNull( mTypeOrder );
Attribute<Person, ?> attrib = mTypeOrder.getDeclaredAttribute( "age" );
assertNotNull( attrib );
Class pAttribJavaType = attrib.getJavaType();
assertEquals( "int", pAttribJavaType.getName() );
}
}
);
}

@Entity(name = "Person")
@Table(name = "PERSON_TABLE")
public static class Person {
@Id
private int id;

private String name;

private int age;
}
}
Expand Up @@ -26,6 +26,7 @@
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.orm.test.legacy.I;

import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
Expand Down Expand Up @@ -226,8 +227,8 @@ public void testBasic(EntityManagerFactoryScope scope) {
"temperature",
Integer.class
);
assertEquals( Integer.class, singularAttribute.getBindableJavaType() );
assertEquals( Integer.class, singularAttribute.getType().getJavaType() );
assertEquals( int.class, singularAttribute.getBindableJavaType() );
assertEquals( int.class, singularAttribute.getType().getJavaType() );
assertEquals(Bindable.BindableType.SINGULAR_ATTRIBUTE, singularAttribute.getBindableType());
assertFalse(singularAttribute.isId());
assertFalse(singularAttribute.isOptional());
Expand All @@ -238,7 +239,7 @@ public void testBasic(EntityManagerFactoryScope scope) {
assertEquals("temperature", attribute.getName());
assertEquals(Fridge.class, attribute.getDeclaringType().getJavaType());
assertEquals(Attribute.PersistentAttributeType.BASIC, attribute.getPersistentAttributeType());
assertEquals( Integer.class, attribute.getJavaType() );
assertEquals( int.class, attribute.getJavaType() );
assertFalse(attribute.isAssociation());
assertFalse(attribute.isCollection());

Expand Down
Expand Up @@ -62,7 +62,7 @@ public void testInjections(EntityManagerFactoryScope scope) {
assertTrue( Animal_.id.isId() );
assertEquals( Long.class, Animal_.id.getJavaType() );
assertNotNull( Animal_.legNbr );
assertEquals( Integer.class, Animal_.legNbr.getJavaType() );
assertEquals( int.class, Animal_.legNbr.getJavaType() );

// Cat (hierarchy)
assertNotNull( Cat_.id );
Expand All @@ -81,9 +81,9 @@ public void testInjections(EntityManagerFactoryScope scope) {
assertNotNull( Fridge_.temperature );
assertEquals( "temperature", Fridge_.temperature.getName() );
assertEquals( Fridge.class, Fridge_.temperature.getDeclaringType().getJavaType() );
assertEquals( Integer.class, Fridge_.temperature.getJavaType() );
assertEquals( Integer.class, Fridge_.temperature.getBindableJavaType() );
assertEquals( Integer.class, Fridge_.temperature.getType().getJavaType() );
assertEquals( int.class, Fridge_.temperature.getJavaType() );
assertEquals( int.class, Fridge_.temperature.getBindableJavaType() );
assertEquals( int.class, Fridge_.temperature.getType().getJavaType() );
assertEquals( Bindable.BindableType.SINGULAR_ATTRIBUTE, Fridge_.temperature.getBindableType() );
assertEquals( Type.PersistenceType.BASIC, Fridge_.temperature.getType().getPersistenceType() );
assertEquals( Attribute.PersistentAttributeType.BASIC, Fridge_.temperature.getPersistentAttributeType() );
Expand Down
Expand Up @@ -40,7 +40,7 @@
import org.hibernate.jpa.boot.spi.Bootstrap;
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.descriptor.java.BigDecimalJavaType;
import org.hibernate.type.descriptor.java.FloatTypeDescriptor;
import org.hibernate.type.descriptor.java.FloatJavaType;
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
import org.hibernate.type.descriptor.java.StringJavaType;
import org.hibernate.type.descriptor.jdbc.BinaryJdbcType;
Expand Down Expand Up @@ -576,7 +576,7 @@ public static class FloatAsRealType extends AbstractSingleColumnStandardBasicTyp
public static final String NAME = "float_as_real";

public FloatAsRealType() {
super( RealJdbcType.INSTANCE, FloatTypeDescriptor.INSTANCE );
super( RealJdbcType.INSTANCE, FloatJavaType.INSTANCE );
}

@Override
Expand Down

0 comments on commit 768e687

Please sign in to comment.