- Declarar entidades y almacenarlas en una base de datos relacional.
- Crear un repositorio de Spring Data y para guardar y recuperar entidades.
- Usar la consola de H2 para visualizar la información de la base de datos.
El postwork se realizará en equipo, los cuales serán formados previamente a la sesión uno.
El propósito de este Postwork es retomar el proyecto del módulo anterior y realizar las modificaciones descritas a continuación.
-
Agrega el driver de MySQL como dependencia del proyecto.
-
Agrega las propiedades para realizar la conexión a la base de datos en el archivo
application.properties
del proyecto. -
Añade un nuevo paquete llamado entities, dentro del paquete persistence.
-
Crea una copia de los objetos contenidos en el paquete model pero coloca las anotaciones de JPA en lugar de las validaciones.
-
Crea un repositorio para cada una de las entidades (recuerda que debe ser una interface que extienda de
JpaRepository
). -
Agrega la dependencia de H2 a la aplicación y asegúrate de que puedes conectarte a esta.
-
Agrega una clase que implemente la interface
CommandLineRunner
de Spring para inicializar los catálogos de la aplicación.
Solución
-
Agrega el driver de MySQL como dependencia del proyecto.
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
-
Agrega las propiedades para realizar la conexión a la base de datos en el archivo
application.properties
del proyecto.spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.generate_statistics=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/bedu?serverTimezone=UTC spring.datasource.username=demos spring.datasource.password=
-
Añade un nuevo paquete llamado entities, dentro del paquete persistence.
-
Crea una copia de los objetos contenidos en el paquete model pero coloca las anotaciones de JPA en lugar de las validaciones.
@Data @Table(name = "CLIENTES") @Entity @NoArgsConstructor public class Cliente { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nombre; @Column(name = "correo_contacto", nullable = false) private String correoContacto; @Column(name = "numero_empleados") private String numeroEmpleados; private String direccion; }
@Data @Table(name = "ETAPAS") @Entity @NoArgsConstructor public class Etapa { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long etapaId; private String nombre; @Column(unique = true, nullable = false) private Integer orden; }
@Data @Table(name = "PRODUCTOS") @Entity @NoArgsConstructor public class Producto { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nombre; private String categoria; private float precio; @Column(name = "numero_registro", length = 20) private String numeroRegistro; @Column(name = "fecha_creacion") private LocalDate fechaCreacion; }
@Data @Table(name = "VENTAS") @Entity @NoArgsConstructor public class Venta { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long ventaId; private float monto; @OneToMany private List<Producto> productos; @ManyToOne private Cliente cliente; @Column(nullable = false) private LocalDateTime fechaCreacion; }
@Data @Table(name = "VISITAS") @Entity @NoArgsConstructor public class Visita { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @ManyToOne private Cliente cliente; @Column(nullable = false) private LocalDateTime fechaProgramada; @Column(nullable = false) private String direccion; @Column(nullable = false) private String proposito; @Column(nullable = false) private String vendedor; }
-
Crea un repositorio para cada una de las entidades (recuerda que debe ser una interface que extienda de
JpaRepository
).public interface ClienteRepository extends JpaRepository<Cliente, Long> { }
public interface EtapaRepository extends JpaRepository<Etapa, Long> { }
public interface ProductoRepository extends JpaRepository<Producto, Long> { }
public interface VentaRepository extends JpaRepository<Venta, Long> { }
public interface VisitaRepository extends JpaRepository<Visita, Long> { }
-
Completa los mappers:
@Mapper(componentModel = "spring") public interface ClienteMapper { Cliente clienteModelToClienteEntity(org.bedu.java.backend.crm.model.Cliente clienteModel); org.bedu.java.backend.crm.model.Cliente clienteEntityToClienteModel(Cliente cliente); }
@Mapper(componentModel = "spring") public interface EtapaMapper { Etapa etapaModelToEtapaEntity(org.bedu.java.backend.crm.model.Etapa etapaModel); org.bedu.java.backend.crm.model.Etapa etapaEntityToEtapaModel(Etapa etapa); }
@Mapper(componentModel = "spring") public interface ProductoMapper { Producto productoModelToProductoEntity(org.bedu.java.backend.crm.model.Producto productoModel); org.bedu.java.backend.crm.model.Producto productoEntityToProductoModel(Producto producto); }
@Mapper(componentModel = "spring") public interface VentaMapper { Venta ventaModelToVentaEntity(org.bedu.java.backend.crm.model.Venta ventaModel); org.bedu.java.backend.crm.model.Venta ventaEntityToVentaModel(Venta venta); }
@Mapper(componentModel = "spring") public interface VisitaMapper { Visita visitaModelToVisitaEntity(org.bedu.java.backend.crm.model.Visita visitaModel); org.bedu.java.backend.crm.model.Visita visitaEntityToVisitaModel(Visita visita); }
-
Agrega la dependencia de H2 a la aplicación y asegúrate de que puedes conectarte a esta.
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency>
-
Agrega una clase que implemente la interface
CommandLineRunner
de Spring para inicializar los catálogos de la aplicación.