2008-12-17 17 views
10
@Column(name="DateOfBirth") 
private Date dateOfBirth; 

Necesito específicamente el código anterior para crear una columna llamada "DateOfBirth", en cambio Hibernate me da una columna llamada date_of_birth. ¿Cómo puedo cambiar esto? ¿Hay una propiedad web.xml? Me encontré con DefaultNamingStrategy y ImprovedNamingStrategy, pero no estoy seguro de cómo especificar uno u otro.Hibernate nombre de la columna emite

+0

Posible trabajo de la empresa. Si lo nombra fecha de nacimiento, la columna en el DB se nombraría así, pero el nombre del atributo debería ser el mismo. – OscarRyz

+0

buena llamada - esto funcionó. ¡Gracias! – lucas

+0

Déjame ponerlo como una respuesta, entonces :) – OscarRyz

Respuesta

5

Aquí hay una posible solución alternativa: si lo nombra dateofbirth, la columna en la base de datos se llamaría así, pero el nombre del atributo debería ser el mismo.

Hibernate toma el formato de caja de camello para crear/leer columnas de la base de datos.

He tenido este problema antes. Trabajé con columnas heredadas donde no había espacio en los nombres de las columnas "employeename", "employeerole", "departmentlocation". Lo odio porque todas las propiedades de mis granos tenían que ser sin estuche de camello.

Las columnas de la base de datos separadas por "_" se usarán correctamente para camelCase como acaba de ver.

0

No estoy 100% seguro, pero ¿no necesita anotar el método get y no la variable privada?

+0

No lo creo?Por lo menos, puedo especificar cosas como la longitud en el nivel de variable de instancia y alterarán las columnas en consecuencia. – lucas

+0

Puede anotar cualquiera de los dos, pero debe anotarlos de forma coherente. Si los mezclas y anotas algunos encabezados y algunos captadores, encontrarán uno e ignorarán el otro. –

6

Ponga la anotación @Column en el captador:

@Column(name="DateOfBirth") 
public Date getDateOfBirth() { 
... 
} 
+1

esto funcionó para mí – chaostheory

1

puede anotar cualquiera de los campos o métodos getter, no hace una diferencia. ¿Puedes publicar tu archivo hibernate.cfg.xml o persistence.xml completo?

1

La solución propuesta fue utilizar @Column (name = "dateofbirth"), que funcionó para mis propósitos.

+0

¿Está diciendo que el único cambio que hizo fue en la capitalización? –

+0

Sí. Parece que ImprovedNamingStrategy fue el perpetrador, que ve los nombres de las columnas de camelcase y los convierte en minúsculas + guiones bajos. Error o característica, usted decide. – lucas

22

FYI: El motivo de la inserción de guiones bajos es probablemente porque está utilizando un ImprovedNamingStrategy. Está configurado en su objeto Configuration. Consulte here para ver un ejemplo ...

Si no desea los guiones bajos, simplemente no puede establecer la estrategia de nomenclatura ni establecerla en la DefaultNamingStrategy que descubrió anteriormente.

+0

Esa es exactamente la causa de este problema. Funciona como un encanto para mí. –

4

ImprovedNamingStrategy tiene addUnderscores() método que se llama a partir nombreTabla() y columnName() puede implementar su propia clase estrategia de nombrar y sustituir estos como por su elección

public class MyOwnNamingStrategy extends ImprovedNamingStrategy { 
     @Override 
     public String tableName(String tableName) { 
     //return addUnderscores(columnName); // skip this 
     return columnName; // if you want column name variable name same 
     //return changeAsYouWant(columnName); // as name sames 
     } 
    } 
+0

Sugiero también llamar "super (tableName)" en cualquier nombre de tabla, no necesita su convención especial ... tal vez – willsteel

2

Trate de poner esto en

application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 
+0

Esto funcionó para mí en una aplicación Spring Boot. –

0

añadir a continuación la propiedad en el caso de arranque de la primavera.

spring.jpa.hibernate.naming.implicit-estrategia = org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-estrategia = org.hibernate.boot.model.naming .PhysicalNamingStrategyStandardImpl

Cuestiones relacionadas