El nombre del proyecto se cambió de Hibernate Types a Hypersistence Utils porque el alcance del proyecto ahora es mucho más amplio y ofrece también utilidades Spring.
Por esta razón, al migrar de Hibernate Types 2.x a Hypersistence Utils 3.x, deberá seguir estos pasos:
com.vladmihalcea.hibernate
a io.hypersistence.utils.hibernate
.com.vladmihalcea.spring
a io.hypersistence.utils.spring
.¡Eso es todo!
El proyecto Hypersistence Utils le ofrece utilidades de uso general tanto para Spring como para Hibernate.
La principal ventaja de este proyecto es que admite una amplia gama de versiones de Hibernate, que van desde Hibernate ORM 6.6 , 6.5 , 6.4 , 6.3 a 6.2 , 6.1 , 6.0 , 5.6 e Hibernate 5.5 .
Dependiendo de la versión de Hibernate que esté utilizando, deberá agregar la siguiente dependencia:
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-63</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-62</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-60</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.hypersistence</groupId>
<artifactId>hypersistence-utils-hibernate-55</artifactId>
<version>3.9.0</version>
</dependency>
El proyecto Hypersistence Utils define una lista de dependencias opcionales que tendrás que declarar explícitamente en tu proyecto para poder utilizarlas.
La razón por la que todas estas dependencias son opcionales, como Guava, Jackson o el controlador JDBC de PostgreSQL, es que es posible que no todos los proyectos las necesiten.
Además, la versión de dependencia es extremadamente importante porque, de vez en cuando, se pueden descubrir problemas de seguridad que se solucionan en versiones más nuevas.
Por lo tanto, confiar en esta biblioteca para que le proporcione las versiones de dependencia es algo muy peligroso.
Por ejemplo, se han descubierto 65 problemas de seguridad en la biblioteca Jackson Data Bind de la que depende en gran medida este proyecto.
Para evitar riesgos de problemas de seguridad, debe asumir la responsabilidad de actualizar constantemente todas las dependencias que utiliza junto con la biblioteca Hypersistence Utils.
Si está utilizando tipos JSON, es posible que le interese configurar las siguientes dependencias según su versión de Hibernate:
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jakarta-xmlbind-annotations</ artifactId >
< version >${jackson-module-jakarta-xmlbind-annotation}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >${jackson-databind.version}</ version >
</ dependency >
< dependency >
< groupId >com.fasterxml.jackson.module</ groupId >
< artifactId >jackson-module-jaxb-annotations</ artifactId >
< version >${jackson-module-jaxb-annotation}</ version >
</ dependency >
Si está mapeando un Range
usando Guava, entonces debe proporcionar la dependencia de Guava explícitamente:
< dependency >
< groupId >com.google.guava</ groupId >
< artifactId >guava</ artifactId >
< version >${guava.version}</ version >
</ dependency >
Si está asignando MonetaryAmount
, debe proporcionar la dependencia de Moneta explícitamente:
< dependency >
< groupId >org.javamoney</ groupId >
< artifactId >moneta</ artifactId >
< version >${moneta.version}</ version >
< type >pom</ type >
</ dependency >
Si está mapeando un tipo de columna específico de PostgreSQL (por ejemplo, inet
, hstore
, array
, interval
), entonces debe proporcionar la dependencia de PostgreSQL explícitamente:
< dependency >
< groupId >org.postgresql</ groupId >
< artifactId >postgresql</ artifactId >
< version >${postgresql.version}</ version >
</ dependency >
JsonType
le permite asignar tipos de columnas JSON, sin importar si está utilizando Oracle, SQL Server, PostgreSQL o MySQL.
Si está utilizando Hibernate 6, puede asignar cualquier columna JSON a la propiedad de entidad Map
, List
, POJO, String
o JsonNode
:
@ Type ( JsonType . class )
private Map < String , String > properties = new HashMap <>();
Si está utilizando Hibernate 5, puede proporcionar el nombre completo del tipo de Hibernate:
@Type(type = "io.hypersistence.utils.hibernate.type.json.JsonType")
O puede agregar la siguiente asignación a su clase package-info.java
en el mismo paquete donde se encuentran sus entidades JPA:
@ TypeDef (
name = "json" , typeClass = JsonType . class
)
package io . hypersistence . optimizer ;
import io . hypersistence . utils . hibernate . type . json . JsonType ;
import org . hibernate . annotations . TypeDef ;
Más adelante, puede asignar las propiedades de entidad Map
, List
, POJO, String
o JsonNode
a columnas JSON como esta:
@ Type ( type = "json" )
private Map < String , String > properties = new HashMap <>();
Para obtener más detalles, consulte este artículo.
Al asignar un tipo de columna JSON a
POJO
,List<POJO>
oMap<String, POJO>
, debe asegurarse de que el tipoPOJO
anule los métodos predeterminadosequals
yhashCode
y los implemente de acuerdo con el contenido del objeto JSON.De lo contrario, el mecanismo de comprobación sucia de Hibernate puede desencadenar declaraciones de ACTUALIZACIÓN inesperadas. Consulte el número 134 para obtener más detalles.
Al utilizar Oracle, tiene varias opciones:
JsonType
genérico que puede funcionar con los tipos de columna JSON
, VARCHAR
o BLOB
, siempre que indique el tipo de columna usando el atributo columnDefinition
de la anotación JPA @Column
.JsonStringType
para asignar un tipo de columna VARCHAR2
que almacene JSON.JsonBlobType
para asignar un tipo de columna BLOB
que almacene JSON.Para obtener más detalles, consulte este artículo.
Al utilizar SQL Server, puede utilizar el JsonType
genérico o el JsonStringType
para asignar un tipo de columna NVARCHAR
que almacene JSON.
Para obtener más detalles, consulte este artículo.
Al usar PostgreSQL, puede usar el JsonType
genérico o el JsonBinaryType
para asignar tipos de columnas jsonb
y json
.
Para obtener más detalles, consulte este artículo.
Al usar MySQL, puede usar el JsonType
genérico o el JsonStringType
para asignar el tipo de columna json
.
Para obtener más detalles, consulte este artículo.
JsonNode
a una columna JSONNo Dialect mapping for JDBC type: 1111
al mezclar tipos JSON con consultas SQL nativascolumn is of type jsonb but expression is of type record
o problema bytea
List
de Java con JPA e HibernateDuration
de Java con Hibernate MonetaryAmount
con JPA e Hibernatejava.time.YearMonth
a la columna DATE o INTEGERjava.time.Year
y java.time.Month
con JPA e HibernateCharacter
a columna CHAR que acepta valores NULLImmutableType
para simplificar las implementaciones UserType
findAll
el antipatrón@Retry
para reintentar automáticamente en caso de error BaseJpaRepository
es una alternativa mucho mejor al Spring Data JpaRepository
predeterminado porque no proporciona un método findAll
o un método save
que no tiene sentido en la terminología JPA.
Para utilizar la utilidad BaseJpaRepository
, asegúrese de proporcionar el atributo repositoryBaseClass
en la configuración @EnableJpaRepositories
para hacer referencia a BaseJpaRepositoryImpl
del proyecto Hypersistence Utils:
@ Configuration
@ EnableJpaRepositories (
value = "your.repository.package" ,
repositoryBaseClass = BaseJpaRepositoryImpl . class
)
public class JpaConfiguration {
...
}
your.repository.package
es el paquete Java de sus repositorios Spring.
Si bien se prefiere BaseJpaRepository
, en caso de que necesite utilizar el JpaRepository
predeterminado, al menos puede extender HibernateRepository
también para desaprobar los métodos que pueden causar problemas.
Para usar HibernateRepository
, asegúrese de incluir el paquete io.hypersistence.utils.spring.repository
en su configuración @EnableJpaRepositories
:
@ Configuration
@ EnableJpaRepositories (
value = {
"io.hypersistence.utils.spring.repository" ,
"your.repository.package" ,
...
}
)
public class JpaConfiguration {
...
}
your.repository.package
es el paquete Java de sus repositorios Spring.
BatchSequenceGenerator
- Generador de secuencias por lotes de hibernación CamelCaseToSnakeCaseNamingStrategy
: cómo asignar propiedades de camelCase a nombres de columnas de Snake_case con Hibernate ClassImportIntegrator
: cómo escribir una consulta de proyección DTO compacta con JPAListResultTransformer
: la mejor manera de utilizar Hibernate ResultTransformerMapResultTransformer
: cómo devolver un resultado de mapa de una consulta JPA o Hibernate SQLStatementCountValidator
: cómo detectar el problema de consulta de Hibernate N+1 durante la prueba SQLExtract
: cómo obtener la consulta SQL de los criterios JPQL o JPAQueryStackTraceLogger
: cómo encontrar el origen de una consulta SQL generada por HibernateEste proyecto es Gratis, como en Libre, no Gratis.
No hay soporte gratuito. Sólo el código fuente y los binarios están disponibles de forma gratuita.
Si necesita ayuda con un problema determinado, deberá adquirir los programas Coaching Basic o Coaching Pro.
Además de las opciones de soporte pago, tienes la opción de proporcionar tu propia solución. Para eso, esto es lo que debe hacer:
Sin embargo, debido a la falta de tiempo, revisaré las solicitudes de extracción enviadas de vez en cuando, por lo que es posible que deba esperar varios meses hasta que se revise e integre la solicitud de extracción.
Imagine tener una herramienta que pueda detectar automáticamente si está utilizando JPA e Hibernate correctamente. No más problemas de rendimiento, no más tener que pasar incontables horas tratando de descubrir por qué su aplicación apenas se rastrea.
Imagine descubrir al principio del ciclo de desarrollo que está utilizando asignaciones y relaciones entre entidades subóptimas o que le faltan configuraciones relacionadas con el rendimiento.
Además, con Hypersistence Optimizer, puede detectar todos estos problemas durante las pruebas y asegurarse de no implementar en producción un cambio que afecte el rendimiento de la capa de acceso a datos.
¡Hypersistence Optimizer es la herramienta que tanto estabas esperando!
Si estás interesado en la formación presencial, puedo ofrecerte mi formación de Persistencia Java de Alto Rendimiento, que se puede adaptar a uno, dos o tres días de sesiones. Para más detalles, visita mi sitio web.
Si desea que revise su aplicación y le brinde información sobre cómo puede optimizarla para que se ejecute más rápido, consulte mi página de consultoría.
Si desea la forma más rápida de aprender cómo acelerar una aplicación de base de datos Java, definitivamente debería inscribirse en mis cursos en video sobre persistencia de Java de alto rendimiento.
O, si prefieres leer libros, también te encantará mi libro Persistencia de Java de alto rendimiento.
El proyecto utiliza Maven Toolchains ya que se compilan y prueban diferentes módulos utilizando diferentes versiones de Java.
Hypersistence Utils 6 requiere Java 11 mientras que los otros módulos están compilados con Java 8.
Para ver cómo configurar Maven Toolchains, consulte este artículo.
El proyecto utiliza varios sistemas de bases de datos para las pruebas de integración, y usted puede configurar los ajustes de conexión JDBC usando las instancias DatasourceProvider
(por ejemplo, PostgreSQLDataSourceProvider
), y el proyecto usa Testcontainers para iniciar un contenedor Docker con Oracle, SQL Server, PostgreSQL o MySQL requeridos. instancia bajo demanda.
Si es un colaborador habitual, es recomendable configurar la base de datos requerida localmente o usar la configuración de Docker Compose proporcionada en la carpeta
docker
, ya que el arranque de los contenedores a pedido es más lento y las pruebas tardarán más en ejecutarse.
Si desea solucionar un problema o agregar soporte para una nueva característica, proporcione el caso de prueba de integración asociado que demuestre que la mejora está funcionando como se esperaba.