En un principio, la anotación JPA 'Table' te permite indicar a que tabla de BBDD esta asociado una clase concreta. Pero al menos en MySQL puede haber casos en los que la traducción no sea correcta. Como en el siguiente caso.
Tenemos una tabla en MySQL con su nombre completo en mayúsculas (BOOK) y así lo indicamos con las anotaciones:
Pero al intentar acceder a los datos de la tabla, ocurre el siguiente error:
Como vemos, parece que el nombre de la tabla lo pasa a minúsculas cuando le indicamos lo contrario. Y todo es debido a la estrategia de nombres establecida por JPA. Por tanto, para arreglar nuestro problema debemos modificar dicha estrategia. Y así es como lo haremos en una aplicación de Spring Boot:
Como vemos hemos indicado que utilice la clase 'EJB3NamingStrategy' para manejar los nombre de las tablas. Spring Boot por defecto utiliza 'SpringNamingStrategy' que extiende de 'ImprovedNamingStrategy'. Mientras que la estrategia de Spring manipula el nombre de la tabla según sus propias reglas, con la estrategia de EJB3 el nombre se quedará tal y como lo indicamos.
Tenemos una tabla en MySQL con su nombre completo en mayúsculas (BOOK) y así lo indicamos con las anotaciones:
@Entity @Table(name = "BOOK", catalog = "mySchema") public class Book implements java.io.Serializable {
Pero al intentar acceder a los datos de la tabla, ocurre el siguiente error:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'mySchema.book' doesn't exist
Como vemos, parece que el nombre de la tabla lo pasa a minúsculas cuando le indicamos lo contrario. Y todo es debido a la estrategia de nombres establecida por JPA. Por tanto, para arreglar nuestro problema debemos modificar dicha estrategia. Y así es como lo haremos en una aplicación de Spring Boot:
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Como vemos hemos indicado que utilice la clase 'EJB3NamingStrategy' para manejar los nombre de las tablas. Spring Boot por defecto utiliza 'SpringNamingStrategy' que extiende de 'ImprovedNamingStrategy'. Mientras que la estrategia de Spring manipula el nombre de la tabla según sus propias reglas, con la estrategia de EJB3 el nombre se quedará tal y como lo indicamos.
No hay comentarios:
Publicar un comentario