Hibernate’s "type system" can be customized in a number of ways depending on the nature of the type (basic, entity, etc).
|
Note
|
Customization of the Hibernate type system is considered an integration activity, as opposed to an application activity. As of 6.0, all of Hibernate’s type system is considered "incubating" |
A Java type in the type system is modeled as org.hibernate.type.descriptor.java.spi.JavaTypeDescriptor.
Hibernate always deals with a JavaTypeDescriptor rather than simply a java.lang.Class because the
descriptor gives Hibernate additional information about the Java type.
org.hibernate.type.descriptor.java.spi.JavaTypeDescriptorRegistry is a registry of
JavaTypeDescriptor by name. Generally the name is simply the name of the described
Java type. Descriptors can be added to the registry or overridden, although generally this
would only happen for basic types.
A SQL type is modeled as org.hibernate.type.descriptor.sql.SqlTypeDescriptor. Again, the descriptor
tells Hibernate additional information about the type.
org.hibernate.type.descriptor.sql.spi.SqlTypeDescriptorRegistry is a registry of SqlTypeDescriptor
by an integer code. Generally this code maps to one of the java.sql.Types codes, however Hibernate
supports "extended" codes.
A basic type in Hibernate boils down to the mapping between a Java type and a SQL type via JDBC.
org.hibernate.type.descriptor.java.spi.BasicJavaDescriptor is a specialization of JavaTypeDescriptor that
describes Java types that are basic values (as opposed to an entity or an embeddable). Hibernate requires
that all basic types be represented by a real Java Class : no non-POJO representations (MAP) are supported
for basic types. The values in the JavaTypeDescriptorRegistry for basic types are always keyed by the
name of corresponding Java class.
BasicJavaDescriptor is further specialized into:
-
org.hibernate.type.descriptor.java.spi.EnumJavaDescriptor -
org.hibernate.type.descriptor.java.spi.TemporalJavaDescriptor -
org.hibernate.type.descriptor.java.spi.Primitive -
org.hibernate.type.descriptor.java.spi.NumericJavaDescriptor
Generally the BasicJavaDescriptor for a particular Java type is resolved from the JavaTypeDescriptorRegistry. There
area number of ways to influence picking which BasicJavaDescriptor is used:
-
Register a corresponding descriptor with the registry.
-
Specify a particular descriptor to use
-
Implicitly via
SqlTypeDescriptor#getJdbcRecommendedJavaTypeMapping(customSqlTypeDescriptor)
todo Examples…
Determining the SqlTypeDescriptor to use for a basic mapping is determined in a number of ways:
-
Register a corresponding descriptor with the registry.
-
Specify a particular descriptor to use
-
Implicitly via
BasicJavaDescriptor#getJdbcRecommendedSqlType(customBasicJavaDescriptor)
todo Examples…
UserType and BasicType.
Changes due to reading from JDBC by position rather than by name
CDI integration for resolving named type classes
todo Examples…
org.hibernate.metamodel.model.creation.spi.RuntimeModelDescriptorClassResolver
org.hibernate.metamodel.model.creation.spi.RuntimeModelDescriptorFactory