2010-06-15 32 views
24

Estoy desarrollando un proyecto en el que estoy persistiendo algunos POJO al agregar anotaciones Hibernate. Un problema al que me estoy enfrentando es que código como este falla, ya que Hibernate intenta mapear los subcampos dentro del Time_T en la misma columna (es decir, startTime.sec y stopTime.sec ambos intentan mapear a la columna sec, causando un error).Agregue automáticamente un prefijo a los nombres de columna para las clases @Embeddable

@Entity 
public class ExampleClass 
{ 
    @Id 
    long eventId; 

    Time_T startTime; 
    Time_T stopTime; 
} 

@Embeddable 
public class Time_T 
{ 
    int sec; 
    int nsec; 
} 

Como habrá muchas ocurrencias de este tipo en todo el sistema, que sería bueno si había una opción para agregar automáticamente un prefijo al nombre de la columna (por ejemplo, hacen que las columnas sean startTime_sec, startTime_nsec, stopTime_sec, stopTime_nsec), sin tener que aplicar anulaciones por campo. ¿Hibernate tiene esta capacidad, o hay alguna otra solución razonable?

+0

Probablemente siguiente hilo tienen la respuesta: http://stackoverflow.com/questions/331744/jpa-multiple-embedded-fields –

Respuesta

21

establecer la propiedad hibernate.ejb.naming_strategy-org.hibernate.cfg.DefaultComponentSafeNamingStrategy

+5

Hibernate 5 dividir la estrategia de nomenclatura en una parte implícita (cuando no se dan reemplazos de columna explícitos) y una parte física, que anula cualquier nombre incluso cuando se define explícitamente con anotaciones de columna. hay una estrategia de nomenclatura implícita por defecto disponibles, que prefijos clases incrustado: 'hibernate.implicit_naming_strategy = org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl' Véase también la [documentación de hibernación] [1] para más detalles [1]: https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html –

+0

¿Qué sucede si ya estoy usando una estrategia de nomenclatura personalizada? ¿Hay algún método específico para anular con un método de esta estrategia? –

4

Otra manera de resolver el problema de intentar es mediante el uso de @AttributeOverrides y anotaciones @AttributeOverride. En su ejemplo, la propiedad Time_T.sec está asignada a la columna sec. Se podría asignar ExampleClass así:

@Entity 
public class ExampleClass { 
    @Id 
    long eventId; 

    @AttributeOverrides(
     @AttributeOverride(name = "sec", column = @Column(name = "start_sec")) 
    ) 
    Time_T startTime; 
    Time_T stopTime; 
} 

El mapeo resultado es startTime.sec <=> start_sec y stopTime.sec <=> sec. Por supuesto, podría usar anotaciones para crear un nombre más significativo para la columna stopTipe.sec.

+2

Esto es explícitamente lo que no quiero hacer, ya que podría haber muchas instancias de este patrón en todo el código. No me gustaría agregar las anotaciones '@ AttributeOverrides' varias cientos de veces. – VeeArr

+0

Lo siento, no presté suficiente atención a su primer mensaje. Usted indicó claramente que no desea anular manualmente los campos. –

5

En mi caso con org.hibernate: hibernate-core: 5.0.12.Final y org.springframework.boot: spring-boot-starter-data-jpa: 1.5.2.RELEASE Tenía que hacer las siguientes propiedades en mi archivo application.properties:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl 
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
Cuestiones relacionadas