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

14/35
Recursos

Aportes 24

Preguntas 8

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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鈥?

驴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.

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?

Utilizando @JoinColumn y @ManyToOne

Perfecto, el reto anterior fue cumplido.

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

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
implements Serializable

tiene que ver con la serializaci贸n de objetos:
La serializaci贸n de un objeto consiste en generar una secuencia de bytes lista para su almacenamiento o transmisi贸n. Despu茅s, mediante la deserializaci贸n, el estado original del objeto se puede reconstruir. Mas info aqu铆

JPA ofrece un plugin para intelliJ el cual se llama JPA Support, este plugin es capaz de leer la estructura de las tablas en tu base de datos y de acuerdo a eso, mapear las entidades a c贸digo java JPA.
sin embargo, es necesario revisar que las relaciones en las tablas si queden correctamente.
Esto te puede ayudar a ahorrar tiempo en el mapeo de entidades si ya tienes muy interiorizado el funcionamiento JPA.

La alternativa a esto seria usar @ManyToMany o @ManyToOne?

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

Consulta, Alguna forma de evitar estos warning al momento de correr el servicio. para la clase ComprasProductoPK ```js HHH000038: Composite-id class does not override equals(): com.platzimarket.persistence.entity.ComprasProductoPK HHH000039: Composite-id class does not override hashCode(): com.platzimarket.persistence.entity.ComprasProductoPK ```busque algunas explicaciones de estos warn y no fueron muy claras. saludos.

Para los que deseen aqu铆 pueden encontrar mis notas hasta este momento en la secci贸n de Spring y JPA

馃槂

Muy interesante.

package com.test.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;

// Se usa la notaci贸n embeddable porque despu茅s se embede en la otra clase
@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;
    }
}

mapeo n-n

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 .