java - lower - jpa query uppercase
Spring boot JPA insert en TABLE con nombre en mayúscula con Hibernate (6)
Puedes probar:
@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
...
tengo una entidad de tabla mapeada como:
@Entity
public class ItemsToRegister implements Serializable{
@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....
Cuando trato de insertar un nuevo registro en la base de datos, el nombre de la tabla se tradujo en minúsculas como: items_to_register, pero mi nombre de tabla es ITEMS_TO_REGISTER ¿Cómo puedo solucionar mi problema sin cambiar la configuración de MySql? (mi.cnf)
Tengo en mi archivo application.properties:
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
Deberá escapar del nombre de la tabla con tics (`) para que sea sensible a mayúsculas y minúsculas.
@Table(name = "`ITEMS_TO_REGISTER`")
La solución es agregar:
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy
a la application.properties :)
¡¡¡Sí!!!
En hibernate 5, sería
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
en su archivo application.properties .
Como @jasonleakey sugirió que podemos considerar el uso de naming-strategy como se muestra a continuación.
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
esto le dice a Hibernate que genere SQL exactamente como se especifica en @Table (name = "") o @Column (name = ""). Todo bien.
Pero tenga en cuenta que, al utilizar PhysicalNamingStrategy sin anotaciones @Table, @Column en la clase de entidad, hibernate genera SQL utilizando el nombre de clase y los nombres de variable. Considere la siguiente clase de java
Class Employee {
private String firstName;
private String lastName;
}
entonces el sql generado sería,
select employee0_.firstName,employee0_lastName from Employee employee0_;
Lamentablemente, esta no es una gran opción, ya que normalmente hubiéramos definido las columnas en DB como FIRST_NAME y LAST_NAME y el nombre de la tabla como EMPLOYEE. Si no hubieras usado PhysicalNamingStrategy, el SQL hubiera sido
select employee0_.first_name,employee0_last_name from employee employee0_;
entonces es realmente una elección entre las dos opciones siguientes.
- Use PhysicalStrategy y defina explícitamente todos los nombres de tablas / columnas en código java con anotaciones @Table y @Column.
o - Defina el nombre de la tabla en minúscula en db y deje que hibernate genere nombres de tabla / columnas para nosotros.
Puede implementar su propia estrategia e invocarla desde application.properties:
spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy
A continuación un ejemplo que siempre escribe en mayúscula la primera letra
import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
/**
* Singleton access
*/
public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();
@Override
public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
private Identifier capitalize(Identifier name) {
if (name == null)
return null;
if (name.isQuoted())
return name;
String text = StringUtils.capitalize(name.getText());
return Identifier.toIdentifier(text);
}
}