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