java - hibernar qué estrategia de nombres es el predeterminado
hibernate jpa (1)
Al investigar cómo implementar una estrategia de nombres personalizada (solo para nombres de tablas) me topé con una incoherencia que no puedo resolver. (Estoy usando hibernate-core 3.6.6.Final en JBoss 6.1.0.Final con PostgreSQL 9.1.9)
Parece haber tres implementaciones NamingStrategy
para NamingStrategy
:
-
DefaultNamingStrategy
-
EJB3NamingStrategy
-
ImprovedNamingStrategy
El valor predeterminado parece establecerse en EJB3NamingStrategy
en org.hibernate.cfg.Configuration
.
Sin embargo, los nombres de las tablas parecen configurarse de acuerdo con una estrategia que no coincide con ninguna de las anteriores.
Ejemplo:
Nombre de clase: package.ClassName
Nombre de tabla resultante: nombre de classname
Las estrategias 1 y 2 simplemente llaman StringHelper.unqualify( className )
que simplemente elimina todos los nombres y puntos del paquete, por lo que el resultado debe ser ClassName
.
La estrategia 3 elimina todos los nombres y puntos de los paquetes, luego coloca un guión bajo antes de cada letra camelcased y finalmente convierte a minúsculas, lo que debería dar el nombre de class_name
.
(El código fuente de hibernate 4.1.0.Final parece no haber cambiado en estas clases).
¿Alguien podría ayudarme a aclarar esto?
¡Muy fácil! Debido a que no quiero hibernate-core 3.6.6.Final
tiempo para crear un ambiente de juguete con hibernate-core 3.6.6.Final
le doy instrucciones de cómo verificar qué instancia se usó EXACTAMENTE EN SU APLICACIÓN DE TRABAJO .
Instale visualvm
en su host. Permite crear un volcado dinámico para la aplicación local. Para crear un volcado de pila en quitar servidor: ejecute el servidor:
jmap -dump:format=b,file=heap.dump $PID
Abrir volcado en visualvm
y ejecutar consulta OQL:
map(heap.objects(''org.hibernate.cfg.Configuration''), "it.namingStrategyDelegator")
Esa es SU ESTRATEGIA DE NOMBRES . Puede usar la pestaña "Instancia" para navegar por la jerarquía de referencia y conocer qué otros tipos de hbm
o jpa se utilizan.
Las diferentes versiones de Hibernate tienen diferentes campos y tipos declarados. Si no hay ningún campo namingStrategyDelegator
, intente buscar en instancia:
heap.objects(''org.hibernate.cfg.Configuration'')
Si esa clase no está en su versión de Hibernate, intente leer documentos y fuentes y encuentre la clase adecuada.
Con la dependencia org.hibernate:hibernate-entitymanager:jar:4.3.11.Final
tengo:
map(heap.objects(''org.hibernate.cfg.Configuration''), "it.namingStrategyDelegator")
== org.hibernate.cfg.naming.LegacyNamingStrategyDelegator
y usa internamente:
LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate
dependiendo de los regalos de las anotaciones de JPA. En cualquier caso, estas instancias hacen referencia a LegacyNamingStrategyDelegator
(¡sí, referencias cíclicas!) Que tienen field namingStrategy
con instancia de org.hibernate.cfg.EJB3NamingStrategy
.
¡Que todos! Paso 1 minuto para encontrar la implementación de la estrategia de nomenclatura predeterminada en mi aplicación web y 5 minutos para escribir esta publicación ((
Gracias por mirar, ¡hacking feliz!