¿Cómo crear entidades en Java para mapear tablas de bases de datos?
En esta sección, te guiaré para crear entidades en Java utilizando JPA (Java Persistence API) y mapearlas a las tablas de tu base de datos. Este proceso es esencial para gestionar bases de datos en aplicaciones Java de manera eficiente.
¿Qué son los entities y cómo se crean?
Los entities o entidades son clases en Java que mapean una tabla de una base de datos mediante anotaciones de JPA. Aquí te indico cómo crear una entidad para una tabla llamada "productos":
Crear una Clase Java: Dentro del paquete Per SystemsEntity, inicia una nueva clase Java llamada Producto para mapear la tabla "productos". Utiliza nombres en singular para las clases.
Añadir Anotaciones JPA:
Usa @Entity para indicar que la clase representa una entidad.
Si el nombre de la tabla en la base de datos es diferente al de la clase, utiliza @Table con el atributo name para definir el nombre real de la tabla.
@Entity@Table(name ="productos")publicclassProducto{// atributos y métodos}
¿Cómo definir los atributos de una entidad?
Para mapear cada columna de la tabla, se definen atributos en la clase que corresponden a las columnas de la tabla:
Atributo para la Clave Primaria: Define un atributo para la clave primaria utilizando tipos de datos empaquetados en Java (p.ej., Integer en lugar de int).
Anotaciones para la Clave Primaria:
Usa @Id para designar el campo como clave primaria.
Usa @GeneratedValue(strategy = GenerationType.IDENTITY) si la clave primaria se genera automáticamente.
¿Cómo se generan métodos getter y setter automáticamente?
Java te permite generar automáticamente los métodos getter y setter, lo que facilita la encapsulación y el acceso controlado a los atributos dentro de tus clases.
Accede al menú de generación de código, selecciona la opción para crear getters y setters, y elige todos los atributos de la clase.
¿Cómo abordar entidades con claves primarias compuestas?
El manejo de claves primarias compuestas implica conocer cómo definir estas entidades, que será explorado en lecciones futuras. Te animo a que, como ejercicio, intentes crear las entidades para la tabla de "categoría" y "cliente". Recuerda, especialmente para "cliente", no es necesario generar automáticamente la clave primaria si es un dato preexistente y único como un número de cédula.
Al seguir estos pasos y entender las anotaciones, podrás construir un modelo de datos robusto y eficiente para tu aplicación Java, reforzando la conexión y manipulación de datos de manera efectiva. ¡Continúa explorando y aprendiendo para convertirte en un experto en desarrollo Java!
Vengo del futuro, el nombrado de las variables/clases en español tiene su propósito. No intenten implementar esta parte en Ingles.
que agradable sujeto
Jajaja presiento que esta declaración merece debate extendido por lo que dure este curso habilitado.
Quisiera dar una mencion aca, desde mi perspectiva, aunque en la clase se usa el tipo Integer para los identificadores o ids, a la larga este tipo de dato no es sustentable, por eso recomiendo el uso del tipo Long.
un apunte muy importante, gracias Fernando.
confirmo afirmo reafirmo
Con la libería Lombok podemos generar automáticamente los getters y setters usando anotaciones y así ahorrarnos mucho código.
Para incluirla debemos añadir esta dependencia en gradle:
compile 'org.projectlombok:lombok:1.18.12'
y ya solo bastaría agregar las anotaciones en la clase para generar los getters y setters
Si ponemos @Getter y @Setter a nivel de clase, se generarán getters y setters para todas sus propiedades. Si queremos getters y setters para sólo una propiedad basta con poner las anotaciones arriba de la propiedad.
Creo saber la razón por la que no se usó lombok para generar los getters and setters. Los mappers de mapstruct (clases más adelante) no funcionan.
Añadiendo el procesador de anotaciones de lombok en el build.gradle lo soluciona
no es buena practica en los imports hacer .*
el ide despues de 4 lo hará automaticamente pero se puede cambiar la propiedad del ide para que automaticamente agregue todo el paquete despúes de 1000 o cualquier número alto
Gran recomendación, Daniela. Gracias!
Hola Daniela gracias por tu aporte, sabes donde puedo configurar esto?
De todos los cursos de JAVA en Platzi, ha sido el mejor profesor como va explicando todo mientras lo va haciendo!
Concuerdo
👏👏👏
Hay una libreria que se llama Lombok que nos ayuda a ahorrar codigo, esta libreria genera los get y los set de manera automatica.
Yo usé la anotación @Data de Lombok para generar los getters y setters. De veras que le ayuda a uno esa anotación.
jakarta(Jakarta EE): A partir de Jakarta EE 9 y versiones posteriores, la plataforma empresarial Java se conoce como Jakarta EE. En un esfuerzo por resolver los problemas de licencia y gobernanza, las clases y las API se movieron del paquete javax al paquete jakarta. Por lo tanto, en Jakarta EE 9 y versiones posteriores, encontrarás clases y API en paquetes como jakarta.servlet en lugar de javax.servlet.
Vengo también del futuro. Cuando estén mapeando la clase "Cliente", tengan cuidado al definir al atributo "id". Este debe ser de tipo "String". No cometan el error de declararlo como un tipo Integer, ya que este error es común y es el causante de varios errores en etapas posteriores.
Yo tengo una duda por que lo pusieron asi? No se supone que una busqueda en la BD por medio de strings es mas pesada que usar solo Integers
Tengo entendido que es una buena practica, dejar como tipo de dato cadena (direccion, nit, id, cel), por que son datos con los que no se van a realizar operaciones
Me gusta usar el proyecto Lombok para no escribir los getters y setters.
Yo use Eclipse, y en la pantalla del código, di click derecho, Source > Generate Getters and Setters.
y listo se escribio en automatico.
Saludos.
¿Alguien me puede explicar esto? No lo entendí bien :(
El cliente ya tiene su clave primaria definida y no necesitamos generarla
Cuando digo "El cliente ya tiene su clave primaria definida, no necesitamos generarla automáticamente", me refiero a que NO debemos anotar el campo id de Cliente con @GeneratedValue porque la clave primaria no la define la base datos sino que lo hace directamente nuestra aplicación porque debemos recibir el número de identificación del cliente al crearlo.
¿Alguien instalo lombok? Digo... para no tener que estar generando los gets y sets
Si señor! Muy util para ahorrarnos codigo y que sea mas limpio todo
Mil gracias @ivancarrenocalzado por tu detallada respuesta, quedo claro.
Para quien esté haciendo este curso en estos días, y con un JDK igual superior a Java 17, no se asusten si la anotación @Entity se carga desde jakarta.persistence... es normal (las dependencias de javax para persistencia, si mal no estoy, fue absorbida por jakarta)
Cual es la diferencia entre usar GenerationType.IDENTITY y GenerationType.SEQUENCE?
La diferencia esta en que JPA cuando ud haga save:
si es **IDENTITY **el no hace nada, la BD lo hace todo
si es **SEQUENCE **el hace un query para obtener el id de la secuencia y fija el id en el insert.
Como bien menciona Fernando, cuando usas GenerationType.IDENTITY la base de datos se encarga de auto-incrementar el valor cada que hace un INSERT.
Por su parte, GenerationType.SEQUENCE ejecuta una sentencia SELECT para verificar el valor de la secuencia (este proceso no tiene impacto en el rendimiento de la aplicación) y luego se le asigna al entity.
Te dejo este video donde explican a detalle las características y comparaciones entre las diferentes estrategias.
Pregunta: ¿los campos ++medio_pago++ y ++estado++ por qué no se declararon de tipo Character si en BD están de tipo character y se le puso de tipo String en el entity?
La verdad no lo pensé mucho y quizás fue por mera practicidad; para ser fieles al mapeo debí haber usado el Character. Para el controller es indiferente porque desde el JSON no puedo indicarle que es solo un carácter y siempre tendré que ponerlo entre comillas dobles (cuando lo recibe entenderá como String).
Modifiqué el código para cambiar por Character e hice las respectivas pruebas y sigue funcionando sin problemas.
Solo para comprobar, usé un JPA Tools que me permite crear los entities automáticamente desde las tablas y utiliza String en lugar de Character 🤷♂️
Para resumir: Debí usar Character pero no existe ningún problema (ni de memoria) con String.
Uno de los principales cambios en SpringBoot 3.1 es que las anotaciones JPA ahora son importadas del paquete jakarta y no javax, ya que tiene como base a Jakarta EE 9: