Antes de empezar

1

Pasos para aprender Java Spring

2

驴Java sigue siendo gratuito?

3

Instalaci贸n de ambiente de desarrollo: Linux Ubuntu

4

Instalaci贸n de ambiente de desarrollo: macOS

5

Instalaci贸n de ambiente de desarrollo: Windows

Introducci贸n a Spring boot

6

驴Qu茅 es y qu茅 usaremos de Spring?

7

Conocer qu茅 es una aplicaci贸n autocontenida

8

Crear nuestra aplicaci贸n con Spring Initializr

9

Hola mundo con Spring Boot

10

Configurar Spring Boot

11

Crear la estructura del proyecto

Spring Data

12

驴Qu茅 es JPA?

13

Conocer qu茅 es Spring Data

14

Conectar la base de datos a nuestra aplicaci贸n

15

Mapear las tablas como clases

16

Crear Entity cuando su clave primaria es compuesta

17

Mapear relaciones entre clases

18

Usar la interface CrudRepository

19

Query Methods

Construyendo nuestra API

20

Implementar la anotaci贸n @Repository

21

驴Qu茅 es el patr贸n Data Mapper y qu茅 resuelve?

22

Orientar nuestra API al dominio con MapStruct

23

Orientar nuestro repositorio a t茅rminos del dominio

24

Inyecci贸n de dependencias

25

Implementar la anotaci贸n @Service

26

Implementar la anotaci贸n @RestController

27

Exponer nuestra API

Mejorando nuestra API

28

Controlar las respuestas HTTP

29

Crear el dominio de compras

30

Mapear el dominio de compras

31

Crear el repositorio de compras

32

Probando nuestros servicios de compras

33

Documentar nuestra API con Swagger

Spring Security

34

Configurar la seguridad de nuestra API con Spring Security

35

Generar un JWT

36

Autenticaci贸n con JWT

37

Autorizaci贸n con JWT

Despliegue de nuestra aplicaci贸n

38

Desplegar nuestra API desde la ventana de comandos

39

Desplegar nuestra base de datos con Heroku

40

Desplegar nuestra API con Heroku

41

Conclusiones y despedida del curso

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de Java Spring

Curso de Java Spring

Alejandro Ram铆rez

Alejandro Ram铆rez

Crear Entity cuando su clave primaria es compuesta

16/41
Recursos

Aportes 17

Preguntas 4

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Solo aprovecho para mencionar a todos aquellos que estan aprendiendo Java en este curso, que aunque para este ejemplo est谩 bien, para un aplicativo real, no se deber铆an usar atributos de tipo Float o Double para almacenar datos monetarios (precios, totales, intereses, impuestos, etc.) sino el tipo de dato BigDecimal. Hay muchos art铆culos que explican el motivo, por ejemplo: https://dzone.com/articles/never-use-float-and-double-for-monetary-calculatio

Abro debate: Llaves compuestas es una mala practica si tienes campos adicionales en la tabla. . Si quieres relacionar muchos a muchos y tienes m谩s campos adicionales para esa tabla, entonces se sugiere crear una PK 煤nica y te evitas mil pasos. . Si quieres relacionar muchos a muchos y no tienes mas campos adicionales que a帽adir, entonces haz la llave compuesta y haz una relaci贸n muchos a muchos.

Cuando se tiene una tabla en la que su llave primara es compuesta, se debe hacer una clase aparte que contenga los atributos que conforman la llave

Creando la Clase que tendra nuestra llave compuesta
Recuerda que debe de contener lo siguiente:


  • se le debe agregar la anotacion @Embeddable
  • se debe de hacer un 鈥渋mplements Serializable鈥
  • debe contener los atributos que conformen la llame compuesta
  • como en la mayoria de entidades debemos crear los getter y setters
@Embeddable
public class ComprasProductoPK implements Serializable {
    @Column(name = "id_compra")
    private Integer idCompra;

    @Column(name = "id_producto")
    private Integer idProducto;

    public Integer getIdCompra() {
        return idCompra;
    }

    public void setIdCompra(Integer idCompra) {
        this.idCompra = idCompra;
    }

    public Integer getIdProducto() {
        return idProducto;
    }

    public void setIdProducto(Integer idProducto) {
        this.idProducto = idProducto;
    }
}

En la clase principal debemos tener:

  • Declarar la variable id como el tipo de la clase que creamos de nuestra llave compuesta que en este caso es : 鈥淐omprasProductoPK鈥
  • Agregarle la etiqueta @EmbeddeId que hace referencia a que es una llave compuesta y que esta dada por otra clase
  • Y nuevamente los Getter y Setters
@Entity
@Table(name = "compras_productos")
public class ComprasProducto {
    @EmbeddedId
    private ComprasProductoPK id;
private Integer cantidad;
private Double total;
private Boolean estado;

    public ComprasProductoPK getId() {
        return id;
    }

    public void setId(ComprasProductoPK id) {
        this.id = id;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public Boolean getEstado() {
        return estado;
    }

    public void setEstado(Boolean estado) {
        this.estado = estado;
    }
}

驴Por qu茅 usamos tipos objetos como 鈥淚nteger鈥 y no su tipo primitivo 鈥渋nt鈥? 驴Se utilizar谩n posteriormente m茅todos de la clase 鈥淚nteger鈥?

Luego de colocar el implements Serializable, VSCode me marca un error y para resolverlo, el quick fix me sugiere que le agregue la l铆nea:
private static final long serialVersionUID = 1L;
Podr铆as explicarnos por qu茅 solicita esta l铆nea?

Las anotaciones de lombok funcionan para mapear objetos de la base de datos?

Para variables que representan dinero se debe de ocupar Bigdecimal en vez de Double

Utilizando @JoinColumn y @ManyToOne

驴No es una mala practica tener una tabla con dos llaves primarias?
Cuando se usan tablas relacionales lo usual es que esta tabla tenga su propio id, eso es lo que tengo entendido de los cursos previos de SQL.

Perfecto, el reto anterior fue cumplido.

Para los getters y setters, se puede usar lombok
https://projectlombok.org/

@Embeddable
Vamos a definir nuestra clase ComprasProductoPK en esta secci贸n. El autor y el nombre especificar谩n id_compra y id_producto que ser谩n los dos id dentro de nuestra clase: la clase es Serializable e implementa m茅todos equals y hashCode

@EmbeddedId
Nuestra entidad ComprasProducto en la variable id (de tipo ComprasProductoPK) toma @EmbeddedId para tomar los valores dentro de ComprasProductoPK el cual indica a JPA que la entidad ComprasProducto tiene una clave compuesta

mapeo n-n

Manera sencilla de implementar Setter y Getter

El c贸digo es mas limpio y f谩cil de leer
Toda la clase es como se ve en la imagen (As铆 de sencillo)

  • O Lo implementan de esta manera

  • Y luego incluyen las anotaciones @Setter y Getter para generar los metodos

no habia algo q te sacaba el mapeado solo? o me equivoquo

Con el implements Serializable, en VS Code me marca un error, y para resolverlo fue necesario colocar la siguiente linea: private static final long seriaVersionUID = 1L;

en mi ejercicio tengo una restricci贸n 煤nica compuesta y la coloqu茅 as铆: uniqueConstraints={
@UniqueConstraint(columnNames = {鈥渄ocumentoIdentificacionArrendatario鈥, 鈥渃odigoInmueble鈥潁)
}
cabe aclarar que solo estoy trabajando con una tabla .