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

Mapear las tablas como clases

13/35
Recursos

Aportes 77

Preguntas 29

Ordenar por:

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

Vengo del futuro, el nombrado de las variables/clases en espa帽ol tiene su prop贸sito. No intenten implementar esta parte en Ingles.

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.

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

@Getter
@Setter
@Entity
@Table(name = "products")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Long categoryId;

    private String sku;

    private Double price;

    private Integer stock;

    private boolean status;

}

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.

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

Hay una libreria que se llama Lombok que nos ayuda a ahorrar codigo, esta libreria genera los get y los set de manera automatica.

Categoria

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "categorias")
public class Category {
    
    @Id
    @Column(name = "id_categoria")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "description")
    private String description;

    @Column(name = "estado")
    private Boolean active;

    public Integer getId() {
        return id;
    }

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

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Boolean getActive() {
        return active;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    
}

Cliente

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "clientes")
public class Client {

    @Id
    private String id;

    @Column(name = "nombre")
    private String firtsName;

    @Column(name = "apellidos")
    private String lastName;

    @Column(name = "celular")
    private Long cellphone;

    @Column(name = "direccion")
    private String address;

    @Column(name = "correo_electronico")
    private String email;

    public String getId() {
        return id;
    }

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

    public String getFirtsName() {
        return firtsName;
    }

    public void setFirtsName(String firtsName) {
        this.firtsName = firtsName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Long getCellphone() {
        return cellphone;
    }

    public void setCellphone(Long cellphone) {
        this.cellphone = cellphone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

De todos los cursos de JAVA en Platzi, ha sido el mejor profesor como va explicando todo mientras lo va haciendo!

Vengo tambi茅n del futuro. Cuando est茅n mapeando la clase 鈥淐liente鈥, tengan cuidado al definir al atributo 鈥渋d鈥. Este debe ser de tipo 鈥淪tring鈥. 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.

Hola, veo que ya java ha cambiado el nombre de sus libreria al usar la Open jdk 17, la inclusi贸n de clases sale as铆 con jakarta:

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

驴Alguien me puede explicar esto? No lo entend铆 bien 馃槮

El cliente ya tiene su clave primaria definida y no necesitamos generarla

Me gusta usar el proyecto Lombok para no escribir los getters y setters.

https://projectlombok.org/

Hello guys, I鈥檓 going to share my way how I solved this challenge, have a look. I used lombook dependency to avoid generating getters and setters methods, In my point of view our entities looks better.
https://github.com/borisbikes/platzi/tree/main/Spring/platzi-market/src/main/java/com/platzi/market/persistence/entity

驴Alguien instalo lombok? Digo鈥 para no tener que estar generando los gets y sets

Este es mi codigo

categorias

package com.platzi.market.persistence.entity;

import javax.persistence.*;

@Entity
@Table(name = "categorias")

public class Categoria {
    @Column(name = "id_categoria" )
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idCategoria;
    private String descripcion;
    private Boolean estado;

    public Integer getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Boolean getEstado() {
        return estado;
    }

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

Cliente

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "clientes")
public class Cliente {
    @Id
    private String id;
    private String nombre;
    private String apellidos;
    private Integer celular;
    private String direccion;
    @Column(name = "correo_electronico")
    private String correoElectronico;

    public String getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Integer getCelular() {
        return celular;
    }

    public void setCelular(Integer celular) {
        this.celular = celular;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
    }
}

Yo suelo usar estas anotaciones en mis proyectos, se las recomiendo:

@Entity
@Table(name = "productos")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@SuperBuilder
public class Producto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_producto")
    private Integer idProducto;

    private String nombre;

    @Column(name = "id_categoria")
    private Integer idCategoria;

    @Column(name = "codigo_barras")
    private String codigoBarras;

    @Column(name = "precio_venta")
    private Double precioVenta;

    @Column(name = "cantidad_stock")
    private Integer cantidadStock;

    private Boolean estado;

}

El curso es bastante viejo, tiene m谩s de tres a帽os y varias cosas han cambiado actualmente, para esta sesi贸n se importan los decoradores usando javax, pero actualmente el estandar es usar jakarta, entonces la importaci贸n seria as铆

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

Ademas es necesario realizar la instalaci贸n de la dependencia, lo pueden ver en Maven Repository, o agregar este c贸digo al archivo build.gradle

implementation 'jakarta.persistence:jakarta.persistence-api:3.2.0-M1'

Existe una manera de no poner los getter y setters de la manera mostrada. De esta manera ser谩 mas limpia la clase. Les recomiendo que coloquen @Data antes del "public class Producto{"
Para esto tienen que usar Lombok. Para esto tendr谩n que usar implementation 鈥榦rg.projectlombok:lombok鈥 como dependencia y descargar el plug in dentro de intellij idea

Recomiendo leer este art铆culo que hace referencia a errores comunes que se pueden presentar al utilizar la combinaci贸n Lombok/Hibernate, especialmente con la anotaci贸n @Data.

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:

import jakarta.persistence.Entity;

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?

Este profe es un pro en la explicaci贸n, hace entender todo de una manera tan sencilla, hasta me inspira a seguir, hay otro de Spring pero no se le entiende bien

En este caso, prefer铆 usar Lombok, para no tener que generar los Getter y Setter

Buenos d铆as, otro aporte que es bueno mencionar es el tema del idioma, por lo general y buena practica es mejor dejar todo en ingles, tambi茅n es bueno utilizar la propiedad length para delimitar la cantidad de caracteres desde la entidad creada.

@Entity
@Table(name = "productos")
public class product {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_producto")
	private Integer idProduct;

	@Column(name = "nombre", length = 45)
	private String name;

	@Column(name = "id_categoria")
	private Integer idCategory;

	@Column(name = "codigo_barras", length = 150)
	private String barCode;

	@Column(name = "precio_venta", length = 16)
	private Double price;

	@Column(name = "cantidad_stock")
	private Integer stockQuantity;

	@Column(name = "estado")
	private Boolean status;

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

Para los que les sale algun error en Intellij porque no coincide el nombre de las Columna o Tablas:

https://stackoverflow.com/questions/14356148/intellij-idea-specify-datasource-for-jpa-validation

Para los que estan tomando el curso en 2024, javax ya no existe, ahora es jakarta. Busquen en google 鈥渏avax jakarta鈥.

OJO, desde la versi贸n 3 de spring, las importaciones se hacen desde jakarta y no de javax. Dejo la documentaci贸n oficial de spring sobre ello: <https://spring.io/guides/gs/accessing-data-jpa/>

Para no generar los Getter y Setter se puede hacer con las anotacciones de: @Getter y @Setter de la dependencia de lombok. Link: https://projectlombok.org/

Alternativas de Getters y Setters con Lombok

para que quede tu clase limpia y evites incluir getters y setters constante mente en tus modelos de datos o entidades, recomiendo usar la API Lombok de la siguiente manera en tu build.gradle

dependencies {
	compileOnly 'org.projectlombok:lombok'
	annotationProcessor 'org.projectlombok:lombok'
	}

<code> 

y en tu entidad java de la siguiente manera

@Entity
**@Data**
@Table(name = "productos")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_producto", nullable = false)
    private Long id;

    @Column(name="nombre")
    private String name;
}

Para que la clase les quede mas elegante usen el framework lombok y les quedar谩 as铆

@Entity
@Table(name = 鈥減roductos鈥)
@Getter
@Setter
public class Producto {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_producto")
private Integer idProducto;
private String nombre;
@Column(name = "id_categoria")
private Integer idCategoria;
@Column(name = "codigo_barras")
private String codigoBarras;
@Column(name = "precio_venta")
private Double precioVenta;
@Column(name = "cantidad_stock")
private Integer cantidadStock;
private Boolean estado;

}

Ya no necesitan, getter y setters

Con spring data jdbc se ahorra todo eso
y con la anotaci贸n @Data omites los setters and getters

// https://mvnrepository.com/artifact/org.projectlombok/lombok
compileOnly group: 鈥榦rg.projectlombok鈥, name: 鈥榣ombok鈥, version: 鈥1.18.28鈥

Si alguno de pronto tiene problemas con la librer铆a jakarta te dej贸 la dependencia que me funcion贸:

<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>

Encontr茅 en la gu铆a: https://central.sonatype.com/artifact/jakarta.persistence/jakarta.persistence-api/3.1.0

Por lo general, por lo que he visto, no se suele hacer un m茅todo Getter y Setter para los id debido a que de nada nos sirve cambiar el id manualmente y en una base de datos gigante se podr铆an llegar a tener problemas si se editara dicha variable.

Les recomiendo instalar el plugin JPA Support para Intellij. Les permitir谩 crear los entity autom谩ticamente

package com.platzi.market.persistencia.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name=鈥渃ategorias鈥)
public class Categoria {

@Column(name="id_categoria")
private Integer idCategoria;

private String descripcion;

private Boolean estado;

public Integer getIdCategoria() {
    return idCategoria;
}

public void setIdCategoria(Integer idCategoria) {
    this.idCategoria = idCategoria;
}

public String getDescripcion() {
    return descripcion;
}

public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}

public Boolean getEstado() {
    return estado;
}

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

}

Les recomiendo utilizar la dependencia Lombok para no tener que generar Getters and Setters manualmente.

https://www.youtube.com/watch?v=745W-dng3wk

Si alguien al igual que yo esta haciendo el proyecto en kotlin, deben usar la siguiente configuracion:

build.gradle.kts

plugins {
	id("org.springframework.boot") version "2.3.3.RELEASE"
	id("io.spring.dependency-management") version "1.0.10.RELEASE"
	kotlin("jvm") version "1.3.72"
	kotlin("plugin.spring") version "1.3.72"
	kotlin("plugin.allopen") version "1.3.72"
	kotlin("plugin.jpa") version "1.3.72"
}

allOpen {
	annotation("javax.persistence.Entity")
	annotation("javax.persistence.Embeddable")
	annotation("javax.persistence.MappedSuperclass")
}```

Esto permite que se generen constructores vac铆os necesarios para la interoperabilidad con las anotaciones de persistencia. 

Y la entidad queda como esta:



```kotlin
@Entity
@Table(name = "productos")
class Producto (
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_producto")
        var id: Int,

        @Column(name = "nombre")
        var name: String,

        @Column(name = "id_categoria")
        var categoryId: Int,

        @Column(name = "codigo_barras")
        var barCode: String,

        @Column(name = "precio_venta")
        var price: Double,

        @Column(name = "cantidad_stock")
        var stock: Int,

        @Column(name = "estado")
        var state: Boolean
)```

Desafio cumplido:

Cliente

@Entity
@Table(name = "clientes")
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Cliente {

    @Id
    @Column(name="id", length = 20)
    private String idCliente;

    @Column(name="nombre", length = 40)
    private String nombre;

    @Column(name="apellidos", length = 100)
    private String apellido;

    private Integer celular;

    @Column(name="direccion", length = 80)
    private String direccion;

    @Column(name="correo_electronico", length = 70)
    private String email;

    public Cliente(String nombre, String apellido, Integer celular, String direccion, String email) {
        this.nombre = nombre;
        this.apellido = apellido;
        this.celular = celular;
        this.direccion = direccion;
        this.email = email;
    }
}

Categoria


@Entity
@Table(name = "categorias")
@Getter
@Setter
@NoArgsConstructor
@ToString
public class Categoria {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idCategoria;

    @Column(length = 45)
    private String descripcion;

    private Boolean estado;

    public Categoria ( String descripcion, Boolean estado){
        this.descripcion = descripcion;
        this.estado = estado;
    }
}

Perfecto, todo est谩 saliendo bastante bien, continuemos

Para las personas que tienen problema con @Table y @Column (Cannot resolve <table o column>) lo m谩s probable es que no tengan alg煤n data source agregado a su IDE.
Para agregar un data source en inteliJ IDEA:

View > Tool Windows > Database

En el menu de Database:

New (Signo +) > Data Source > Postgres (O la DB que est茅s utilizando)

Por 煤ltimo, pasa el cursor en alguno de los errores marcados y agrega el nuevo data source. Suerte!

Hay una forma de crear las tablas autom谩ticamente desde el mismo c贸digo, sin necesidad de estar manipulado la BD. Podemos hacer uso de la propiedad spring.jpa.hibernate.ddl-auto=create, esta la agregamos en el archivo application.properties y cuando creamos las Entity en nuestro proyecto y corremos el App, la tabla es creada autom谩ticamente en la base de datos.

Gracias profesor!!!
Tip!! si usas Windows para los Setter and Getters puedes utilizar alt + insert.
En resumen, la transici贸n de `javax` a `jakarta` es parte de la evoluci贸n continua de las tecnolog铆as de plataforma empresarial de Java, y se recomienda utilizar `jakarta` para proyectos nuevos basados en las 煤ltimas versiones de las especificaciones Jakarta EE. La elecci贸n entre `javax` y `jakarta` depender谩 del contexto del proyecto y las versiones espec铆ficas de las bibliotecas y tecnolog铆as que est茅s utilizando.
**Evoluci贸n a Jakarta EE:** * Debido a problemas de gobernanza y licencia, Oracle transfiri贸 Java EE a la Eclipse Foundation en 2017, y se renombr贸 a Jakarta EE. * El proyecto Jakarta EE continu贸 el desarrollo de las tecnolog铆as de plataforma empresarial de Java. ESTA MUY ATRASADO ESTE CURSO
esta desactualizado el curso y esto hace confundir
Me dar谩 problemas despu茅s si mis import son as铆: import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table;

fuente oficial que explica como definir una Entity simple:
https://spring.io/guides/gs/accessing-data-jpa/

Seg煤n la docuentaci贸n oficial ser铆a buena pr谩ctica agregar tambi茅n en una Entity sus contructores y el m茅todo toString para mostrar las propiedades de esta misma.
Ej:

protected Customer() {}

  public Customer(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  @Override
  public String toString() {
    return String.format(
        "Customer[id=%d, firstName='%s', lastName='%s']",
        id, firstName, lastName);
  }

tambi茅n podr铆a ser mejor el tipo Long para los id que se pusieron con Integer.
Ej:

 @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  private Long id;

Creo que es mucho mejor definir el atributo 鈥渋dProducto鈥 del tipo UUID:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name= "id_producto"
private UUID idProducto;

Excelente.

Si estas haciendo el proyecto en vscode, existe una extension llamada PostgreSQL Explorer para poder gestionar el schema de tu base de datos y ejecutar consultas. La puedes encontar aqui:

https://marketplace.visualstudio.com/items?itemName=ckolkman.vscode-postgres

Clase categor铆a:

package com.platzi.market.persistence.entity;

import javax.persistence.*;

@Entity
@Table(name = "categorias")
public class Categoria {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_categoria")
    private Integer idCategoria;

    private String descripcion;

    private Boolean estado;

    public Integer getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Boolean getEstado() {
        return estado;
    }

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

Clase cliente:

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="clientes")
public class Cliente {
    @Id
    private String id;

    private String nombre;

    private String apellidos;

    private Double celular;

    private String direccion;

    @Column(name = "correo_electronico")
    private  String correoElectronico;

    public String getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Double getCelular() {
        return celular;
    }

    public void setCelular(Double celular) {
        this.celular = celular;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
    }
}

si utilizas @FieldDefaults(level = AccessLevel.PRIVATE) agerega un modificador de acceso private a todos los atributos de la clase, ahorrando escribir private a cada campo.

Pude completar el reto. Est谩 en mi repositorio de Github

@Entity
@Table(name = "categorias")
public class Categoria {

    @Column(name = "id_categoria")
    private Integer idCategaria;

    private String descripcion;

    private Boolean estado;
}
@Entity
@Table(name = "clientes")
public class Cliente {

    private String id;

    private String nombre;

    private String apellidos;

    private Integer celular;

    private String direccion;

    @Column(name = "correo_electronico")
    private String correoElectronico;
}
<package com.platzi.market.persistence.entity;

import javax.persistence.*;

@Entity
@Table(name = "categorias")
public class Categoria {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_categoria")
    private Integer idCategoria;

    private String descripcion;

    private Boolean estado;

    public Integer getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Boolean getEstado() {
        return estado;
    }

    public void setEstado(Boolean estado) {
        this.estado = estado;
    }
}> 
<package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "clientes")
public class Cliente {

    @Id
    private String id;

    private String nombre;
    private String apellidos;
    private Integer celular;
    private String direccion;

    @Column(name = "correo_electronico")
    private String correoElectronico;

    public String getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Integer getCelular() {
        return celular;
    }

    public void setCelular(Integer celular) {
        this.celular = celular;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
    }
}> 

Les dejo esta lectura para conocer m谩s de spring data y porque usar generate en identity or secuency

Que buena clase, empieza lo interesante

Categoria

package com.platzi.market.persistence.entities;

import javax.persistence.*;

@Entity
@Table(name = "categorias")
public class Categoria {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_categoria")
    private Integer idCategoria;

    private String descripcion;

    private Boolean estado;

    public Integer getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Boolean getEstado() {
        return estado;
    }

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

Cliente

package com.platzi.market.persistence.entities;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

public class Cliente {

    @Id
    private String id;

    private String nombre;

    private String apellidos;

    private Integer celular;

    private String direccion;

    @Column(name = "correo_electronico")
    private String correoElectronico;

    public String getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Integer getCelular() {
        return celular;
    }

    public void setCelular(Integer celular) {
        this.celular = celular;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
    }
}

En el Script de la bd 鈥 la columna id de categoria es id y no 鈥渋d_categoria鈥濃

Hola, que tal!!!
驴C贸mo har铆an para el caso de que todas sus tablas tengan un campo de el usuario que hizo el registro o modificaci贸n?

Se me hace como muy contaminante en todas mis clases tener un atributo que se llame @Column(name = 鈥淯SUARIO_REG鈥) private String usuario;

Habr谩 forma de tener como algun interceptor o algo que en todas mis acciones de save me coloque ese dato en el usuario ? espero darme a entender

Tengo una consulta yo estoy trabajando con Spring tool suite y para que me reconozca las dependencias del archivo build.gradle, tengo que colocar compile(鈥榦rg.springframework.boot:spring-boot-starter-data-jpa鈥) para que me reconozca la dependecia, ahora mi consulta es que diferencia hay entre implementation y compile en el archivo de configuraci贸n de build.gradle

package com.platzi.market.persistencia.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name=鈥渃lientes鈥)
public class Cliente {
private String id;
private String nombre;
private String apellido;
private Integer celular;
private String direcci贸n;
@Column(name=鈥渃orreo_electronico鈥)
private String correoElectronico;

public String getId() {
    return id;
}

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

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public String getApellido() {
    return apellido;
}

public void setApellido(String apellido) {
    this.apellido = apellido;
}

public Integer getCelular() {
    return celular;
}

public void setCelular(Integer celular) {
    this.celular = celular;
}

public String getDirecci贸n() {
    return direcci贸n;
}

public void setDirecci贸n(String direcci贸n) {
    this.direcci贸n = direcci贸n;
}

public String getCorreoElectronico() {
    return correoElectronico;
}

public void setCorreoElectronico(String correoElectronico) {
    this.correoElectronico = correoElectronico;
}

}

Clase Categor铆a

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "categorias")
public class Categoria {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_categoria")
    private Integer idCategoria;

    private String descripcion;
    private Boolean estado;

    public Integer getIdCategoria() {
        return idCategoria;
    }

    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Boolean getEstado() {
        return estado;
    }

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

Clase Cliente

package com.platzi.market.persistence.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "clientes")
public class Cliente {
    @Id
    private String id;

    private String nombre;
    private String apellidos;
    private Integer celular;
    private String direccion;

    @Column(name = "correo_electronico")
    private String correoElectronico;

    public String getId() {
        return id;
    }

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

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public Integer getCelular() {
        return celular;
    }

    public void setCelular(Integer celular) {
        this.celular = celular;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCorreoElectronico() {
        return correoElectronico;
    }

    public void setCorreoElectronico(String correoElectronico) {
        this.correoElectronico = correoElectronico;
    }
}

Hola chicos y chicas, tengo entendido que en cualquier tabla es buena pr谩ctica siempre declarar un campo autoincrementable y que generalmente este sea el id y pues que la identificaci贸n suele ser un campo 煤nico en la base de datos mas no una llave primaria, saludos!!

Una pregunta muy puntual, 驴Porqu茅 en las en la mayor铆a de las entidades no se implementa la interfaz Serializable?

Me ha gustado mucho la explicacion, detalla cada cosa, y su deseo porque los estudiantes comprendan a la perfeccion los temas, esto es Universidad De Desarrollo de software Platzi鈥

Excelente, la creaci贸n sencilla y ordenada, muy bien explicado

Si est谩n usando JDK15 y no les reconoce las anotaciones del paquete jaba.persistence, deben agregar la dependencia al proyecto:

// https://mvnrepository.com/artifact/javax.persistence/javax.persistence-api
compile group: 'javax.persistence', name: 'javax.persistence-api', version: '2.2'

Puede verse en este repo de maven repository.

Categoria.java:

package com.platzi.market.persistence.entity;

import javax.persistence.*;

@Entity
@Table(name = 鈥渃ategorias鈥)
public class Categoria {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id_categoria")
private Integer idCategoria;

private String descripcion;

private Boolean estado;

public Integer getIdCategoria() {
    return idCategoria;
}

public void setIdCategoria(Integer idCategoria) {
    this.idCategoria = idCategoria;
}

public String getDescripcion() {
    return descripcion;
}

public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}

public Boolean getEstado() {
    return estado;
}

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

}

Cliente.java:

package com.platzi.market.persistence.entity;

import javax.persistence.*;

@Entity
@Table(name = 鈥渃lientes鈥)
public class Cliente {

@Id
private String id;

private String nombre;

private String apellidos;

private Long celular;

private String direccion;

@Column(name = "correo_electronico")
private String correoElectronico;

public String getId() {
    return id;
}

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

public String getNombre() {
    return nombre;
}

public void setNombre(String nombre) {
    this.nombre = nombre;
}

public String getApellidos() {
    return apellidos;
}

public void setApellidos(String apellidos) {
    this.apellidos = apellidos;
}

public Integer getCelular() {
    return celular;
}

public void setCelular(Integer celular) {
    this.celular = celular;
}

public String getDireccion() {
    return direccion;
}

public void setDireccion(String direccion) {
    this.direccion = direccion;
}

public String getCorreoElectronico() {
    return correoElectronico;
}

public void setCorreoElectronico(String correoElectronico) {
    this.correoElectronico = correoElectronico;
}

}

En caso el nombre del atributo en camel case coincida con el nombre de la tabla en snake case, no es necesario usar la anotaci贸n column.