Mapeo de tablas con @Table

Tutorial de JPA @TableEn la sección hablaremos de la anotación @Table  y su importancia a la hora de definir entidades. La anotación @Table es utilizada para indicarle a JPA contra que tabla debe de mapear una entidad, de esta manera cuando se realice una persistencia, borrado o select de la entidad, JPA sabrá contra que tabla de la base de datos deberá interactuar.

Anotación @Table

Como comenté, esta anotación se utiliza para indicar la tabla contra la que mapea la entidad, pero también tiene otras propiedades interesantes como las que se muestra a continuación:

  • name: se utiliza para poner el nombre real de la tabla en la base de datos, es recomendable que el nombre sea exacto respetando mayúsculas y minúsculas, sobre todo cuando trabajamos en Linux.
  • schema: se utiliza para indicar el schema en el que se encuentra la tabla. Esta propiedad por lo general no es necesaria, a menos que la tabla se encuentre en un schema diferente al que utilizamos para logeamos.
  • Indexes: JPA permite indicar los índex que tiene nuestra tabla, esta opción toma relevancia cuando indicamos que JPA cree las tablas por nosotros (más adelante veremos esta característica).

Veamos cómo quedaría @Table en la entidad Employee que revisamos en la unidad pasada:

Observemos que hemos definido que la clase Employee mape contra la tabla EMPLOYEES, le decimos que la tabla está en el schema jpatutorial y que tiene un index llamado name_index para ordenar el nombre del empleado. En el caso del index para el nombre del empleado, estamos diciendo que el nombre deberá ser único

NOTA: La notación @Table no es obligatoria, pero el hecho de no ponerla supone que JPA determine que la tabla se llama igual que la clase y la buscara en el schema en que estas logeado.

Auto generación de schemas

Una de las grandes ventajas de JPA es que puede crear todos los objetos de la base de datos como Tablas y Secuencias de forma automática por medio de lo metadatos. Este comportamiento es definido en el archivo persistence.xml, regresemos a este archivo y veremos que tiene una propiedad llamada Table Generation Strategy la cual tiene los siguiente posibles valores:

  • Create: Le indicamos a JPA que si un objeto no existe lo cree, pero si ya existe ese no será creado ni actualizado. Un detalle a tomar en cuenta es que si a una entidad de le agregamos un campo nuevo y su tabla ya existe, este campo nuevo no se creara, por lo que tendremos que actualizar manualmente la tabla o borrarla para que la cree de nuevo al instanciar el EntityManager.
  • Drop and Create: Esta estrategia borra todos los objetos para volverlos a crear, esta estrategia nos garantiza que todos los objetos de la base de datos estén actualizados con las entidades. PELIGRO: Esta estrategia es muy peligrosa, ya que nos borrara toda la información que tengamos en la base de datos y será imposible recuperarla, lo cual sería fatal si lo ejecutamos en ambiente productivo.
  • None: Con esta opción le decimos a JPA que no haga nada, es decir que no cree ni borre nada. Esta opción es la mejor cuando tenemos ya tenemos todo el modelo de base de datos desarrollado en la base de datos. O cuando nos conectamos a un modelo ya existente.

Yo te sugiero que inicies usando la estrategia Create para así no preocuparte por la creación de los objetos, por otra parte, mi consejo es que nunca uses Drop and create porque es demasiado riesgoso. En la sección siguiente veremos en acción esta propiedad ya que por el momento la entidad Employee no está terminado para hacer una prueba.

Retomando la propiedad index de @Table, esta propiedad solo sirve para la creación de la tabla y no tiene ningún funcionamiento en tiempo de ejecución, por lo que si tu estas trabajando con la estrategia None, entonces no tiene caso definir esta propiedad.

 

NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.

 

AnteriorÍndiceSiguiente
 

 

Artículos relacionados

Llaves compuestas con @IdClass Existen ocasiones en donde se requieres marcar más de un campo como @Id, conformando con esto una llave primaría compuesta. En estos casos se requiere...
JPA – Resource Local transaction Resource Local es un tipo de transaccionalidad que soporta JPA que delegar la responsabilidad de las transacciones al programador, de esta manera, el ...
Declarar entidades con @Entity Una de las grandes ventajas de JPA es que nos permite manipular la base de datos a través de objetos, estos objetos son conocidos como Entity, las cua...

Oscar Blancarte

Ideológico, Innovador y emprendedor, Padre, Tecnólogo y Autor, amante de la ciencia y la tecnología en todos sus colores y sabores. Arquitecto de software & Full Stack Developer con experiencia en la industria del desarrollo de software y la consultoría. Amante de la programación y el Ajedrez.

4 comentarios en “Mapeo de tablas con @Table

  1. Estimado OScar muy buenos dias, muy intersante el blog, le comento que soy nuevo en estos de java y me esta sirviendo mucho la inforamción publicada, pero tengo un problema con la creacion de las tablas en la base, todo lo crea en minusculas y el orden de los campos varia con respecto a lo definido en la clase, necesito crear las tablas con el nombre “Empleado” y la crea como empleado o “DocumentosGenerales” como documentosgenerales y estoy trancado con este tema, como podria ayudar con este tema, gracias de antemano

    1. Hola Cristina, por lo que me cuentas, seguramente estas trabajando en Linux y probablemente utilizas MySQL como base de datos.

      Lo que te puedo recomendar, es utiliza siempre la anotación @Table(name=”“) en todas tus entidades, con la intención de forzar el nombre. Si esto no funciona, tiene que ver la instalación de la base de datos, pues algunas veces se instala para no ser sensible a Mayúsculas-Minúsculas, lo que hace que haga un Upper o Lower case de los nombre de los objetos.

      Finalmente, sería bueno saber que OS y base de datos esta utilizando, así como la implementación de JPA que estas utilizando, pues cada implementación funciona ligeramente diferente a las demas.

      1. Gracias por la pronta respuesta Oscar, bueno estoy trabjando con la PostgreQL 9.6 en windows 7 y la base me acepta para los nombres mayusculas y minusculas, estoy en un proyecto maven con spring boot y mi archivo de hibernateproperties:

        # ——————————
        # Spring Data JPA CONFIGURATION
        # ——————————
        hibernate.show_sql=true
        hibernate.format_sql=true
        hibernate.hbm2ddl.auto=create-drop
        hibernate.dialect =org.hibernate.dialect.PostgreSQLDialect

        1. Hola Cristian,

          Lo que me comentas me paso alguna vez y no recuerdo bien la solución que aplique, pero estoy casi seguro que fue debido a una configuración de la base de datos, si en tu caso se presenta incluso con una configuración que soporta Camel Case, entonces solo quedaría revisar la documentación de Hibernate para ver que propiedad pues aplicar para solucionar el problema. De entrada no se me ocurre más que eso.

          saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *