La creación de entidades en un proyecto usando Hibernate y JPA es un proceso esencial para traducir tu modelo lógico al físico, generando automáticamente tablas en la base de datos. En este artículo, exploraremos cómo configurar y crear entidades básicas, comenzando con PizzaEntity y OrderEntity.
¿Cómo se configura la clase PizzaEntity?
Para comenzar a definir nuestra entidad PizzaEntity, lo primero es entender que cada clase se debe anotar con @Entity y @Table, lo que indica que se traducirá a una tabla:
Importante: En caso de atributos que representen fechas o precios, es crucial definir correctamente los tipos de datos con columnDefinition.
Aclaración: Atributos como additionalNotes permiten null, lo que implica que no es necesario anotar con nullable si no afecta el diseño.
¿Qué librerías se utilizan?
Se hace uso de las librerías proveídas por Jakarta para la gestión de persistencia y entidades. Esto es esencial al migrar desde JavaX. Herramientas como Lombok pueden facilitar la creación de getters y setters sin complicar el código con @Data cuando no es necesario, especialmente para prácticas más refinadas en ORM.
@Getter@Setter@NoArgsConstructorpublicclassPizzaEntity{// Atributos y configuración}
¿Por qué es importante definir estrategias y validaciones?
Definir estrategias para la generación de valores, como con strategy = GenerationType.IDENTITY, es vital para garantizar que la base de datos maneje eficientemente los IDs. La validación de datos a nivel de base de datos mediante constraints como nullable = false y unique = true protege la integridad del modelo.
¿Cómo probar la creación automática de tablas?
Después de definir las entidades y configurarlas con Hibernate, al ejecutar la aplicación, las tablas deberían generarse automáticamente. Esto se puede confirmar si en el log de la consola Hibernate muestra mensajes de create table indicando la creación de pizza y pizza_order.
¿Puedes implementar otras entidades?
Te invito a que crees las entidades restantes, Customer y OrderItem, aplicando los conceptos discutidos aquí. Un desafío adicional es implementar las claves primarias compuestas para OrderItem. ¡No te desanimes si encuentras dificultades! Aprender y explorar nuevas técnicas es parte del viaje del desarrollo de software.
@Column(columnDefinition ="smallint")// para mysql es "tinyint"privateBoolean vegetarian;@Column(nullable =false, columnDefinition ="timestamp")// para mysql es "datetime"privateLocalDateTime date;
Estructura de la base de datos:
Me hubiera encantado haber empezado por este curso en vez de arrancar con el anterior. La estructura orientada a dominio me confundió muchísimo. Me parece que este curso está increíblemente más claro. Dejo claro que el profesor trabaja increíblemente bien en ambos cursos (asdasd), solo que el anterior tuvo un nivel de complejidad muchísimo más alto.
Hola tú,
Si no estás tan familiarizado con Lombok, al usar las anotaciones
@Getter@Setter
lo que hacen es generar automáticamente los getters y setters de cada una de las propiedades, esto ayuda a que el código sea más legible y no que apenas abres la clase, ves el chorrero de getters y setters, otra ventaja es que si a la clase le añades una propiedad pero olvidaste añadir el get y set, Lombok usando estas anotaciones lo hace automáticamente por ti.
Aca hubiera sido importante explicar un poco que hace lombok y por qué se usa. yo lo entendi porque vi el curso pasado donde haciamos los getters y setters de la forma tradicional, pero mucha gente llega de una vez a este curso
Si estás viendo este curso, como mínimo debes saber qué son los getters y setters.
Dato:
No es necesario especificar el nombre de la columna en @Column cuando sera traducido a snake_case, Spring hace la conversion automaticamente, es decir:
Otra observación, la anotación @Id se refleja en la base de datos como la restricción primary_key, es decir, es una combinación de dos restricciones, not_null y unique, una primary key en una base de datos no puede ser null ni tampoco puede repetirse (unique).
siempre ser explicito para futuros mantenimientos. Es una recomendación.
usar ese columnDefinition hace que el codigo quede fuertemente acoplado a la bd.
no seria mejor dejar que hibernate lo manejara?
Si te refieres a la parte donde usa TINYINT (o cualquier tipo de dato de la base de datos), creo que tienes razon, yo decidi no usarlo y dejar que hibernate escoja en que considere mejor, en mi caso escogio "bit".
x3
tambien decidí no usarlo y mas en mi caso que no usé mysql sino Postgres
no se recomienda @Data ya que lombok gestiona automáticamente los métodos equals() y hasCode() lo cual es una mala practica hacerlo a través de lombok para entidades
en su lugar se coloca
@Getter
@Setter
@NoArgsConstructor
Excelente eso de dejar el diagrama en pantalla profe Alejandro, muchas gracias.
Como podria evitar que hibernate cree las tablas en base de datos?
Hola, muy tarde mi respuesta pero igual la dejo, sería en el properties establecer la propiedad spring.jpa.hibernate.ddl-auto=none, o quitar esta propiedad tomará por defecto none.
Cual es lo correcto Long o Integer en los IDs?
Ambos tipos de datos son para declarar un número entero. La diferencia es en el rango de valores que puedes alcanzar. El tipo Integer (o int) es un entero de 32 bits mientras que el tipo Long es de 64 bits. La cantidad de bits determina cuán alto es el valor máximo que un tipo de dato puede alcanzar. Se aconseja usar el tipo Long cuando se necesite un rango de valores más grande que el de int
use postgresql y lo hice de esta forma
x2 excelente.
En el contexto de JPA y Hibernate, la entidad orderEntity debe definir idCustomer como una llave foránea para establecer la relación con otra entidad, como CustomerEntity. Aunque en el transcript no se mencionó explícitamente la configuración de llaves foráneas, es común utilizar la anotación @ManyToOne en idCustomer para indicar que muchas órdenes pueden estar asociadas a un solo cliente. Esto facilita la integridad referencial en la base de datos. Asegúrate de incluir esta relación para tener un modelo de datos completo y funcional.
Lo que hay que tener en cuenta es que si se definen los tipos de campos y la creación en la entidad, la portabilidad a otra base de datos como postgres ya no será transparente e implicará modificar código de la entidad. Como aprendizaje muy util.
Cuando se refiere a los entity, estamos hablado de los modelos para acceder a la BD ?
Las clases entidad (entity) son objetos que se van a transformar en tablas de una base de datos. A su vez, los atributos que le des a esa clase se van a transformar en las columnas de esa tabla.
Cada vez que creas una nueva clase o atributo, estás mapeando/creando una nueva tabla o columna en la base de datos.
como hace para tener ese tema de IntelliJ o que configuración o theme descargo se ve bacon?
no sabria decirte ese en especifico pero en configuraciones en plugins descargas muchos temas, 2 que te recomiendo son "github dark theme" y "Night Owl"
En algunos proyectos propios utilice el @Data para las entidades. Recuerdo que me genero algunos inconvenientes en su momento, pero bajo que fundamentos se justifica que es un error utilizar los equals y hashCode autogenerados por Lombok para entidades?
Te dejo esta entrada donde explican a detalle por qué evitar el uso de esta anotación (y otras) dentro de los entites de JPA.
Por que no definir method como "Character" en vez de "String"? Ya en base de datos estamos diciendo que es CHAR(1) deberiamos hacer lo mismo en codigo para ocupar menos memoria
No se si mi resolucion del reto este bien pero aqui el codigo!