La anotación @Entity
en Spring Boot se utiliza para definir una clase como una entidad de base de datos. Es parte de la especificación JPA (Java Persistence API) y se emplea para mapear clases Java a tablas en una base de datos relacional. Cada instancia de una clase anotada con @Entity
representa una fila en la tabla correspondiente, permitiendo a las aplicaciones Spring interactuar con los datos de manera sencilla y orientada a objetos.
@Entity
es una anotación de JPA que se utiliza para marcar una clase como una entidad persistente, lo que significa que sus instancias se pueden almacenar, recuperar, actualizar y eliminar de la base de datos. La clase se convierte en un modelo de datos que Spring Boot y JPA utilizan para realizar operaciones de persistencia automáticamente.
1. Mapeo a tablas: La clase se mapea a una tabla de base de datos con el mismo nombre de la clase (a menos que se especifique otra con @Table
).
2. Identificador único: Se requiere un campo que actúe como clave primaria, definido con @Id
.
3. Campos persistentes: Cada atributo de la clase se convierte en una columna en la tabla correspondiente (a menos que se anote con @Transient
).
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Usuario {
@Id
private Long id;
private String nombre;
private String correo;
// Getters y Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getCorreo() {
return correo;
}
public void setCorreo(String correo) {
this.correo = correo;
}
}
En este ejemplo:
@Entity
marca la clase Usuario
como una entidad.
@Id
indica que el campo id
es la clave primaria de la tabla.
nombre
y correo
se convierten en columnas de la tabla Usuario
en la base de datos.
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "usuarios") // Define un nombre personalizado para la tabla
public class Usuario {
@Id
private Long id;
private String nombre;
private String correo;
// Getters y Setters
}
Aquí, la anotación @Table(name = "usuarios")
se usa para especificar que la tabla correspondiente se llamará usuarios
en lugar de Usuario
.
La anotación @Entity
también se puede combinar con otras anotaciones de JPA para definir relaciones entre entidades, como @OneToMany
, @ManyToOne
, @OneToOne
y @ManyToMany
.
import javax.persistence.*;
import java.util.List;
@Entity
public class Departamento {
@Id
private Long id;
private String nombre;
@OneToMany(mappedBy = "departamento") // Relación de uno a muchos con la entidad Usuario
private List<Usuario> usuarios;
// Getters y Setters
}
@Entity
public class Usuario {
@Id
private Long id;
private String nombre;
@ManyToOne // Relación de muchos a uno con la entidad Departamento
@JoinColumn(name = "departamento_id") // Define la columna de relación
private Departamento departamento;
// Getters y Setters
}
En este ejemplo:
Departamento
tiene una lista de Usuario
con la relación @OneToMany
.
Usuario
se relaciona con Departamento
usando @ManyToOne
.
@JoinColumn(name = "departamento_id")
especifica la columna en la base de datos que establece la relación.
1. Debe tener un identificador: Todas las entidades deben tener un campo marcado con @Id
.
2. Debe tener un constructor vacío: JPA requiere que las entidades tengan un constructor público o protegido sin argumentos.
3. No debe ser final: La clase no debe ser final
y los métodos de la entidad deben ser accesibles para permitir el proxying de JPA.
Aunque @Entity
gestiona la persistencia de datos, no es intercambiable con @Component
porque @Entity
no participa en el escaneo de componentes ni en la inyección de dependencias como los beans de Spring (@Service
, @Controller
, @Repository
). Sin embargo, es común combinar @Entity
con @Repository
para definir capas de persistencia en una aplicación Spring Boot.
Puedes obtener más información sobre @Entity
en la documentación oficial de JPA o la guía de Spring Data JPA.
Jorge García
Fullstack developer