📌 Arquitectura de Clases en Java
Comparativa profunda entre POJO, Entidades JPA, DTO, Value Objects y Repositorios
| Tipo de Clase | ¿Qué representa? | Mutabilidad | Anotaciones / Librerías | Uso Típico |
|---|---|---|---|---|
| POJO | Objeto Java simple sin reglas estrictas | Mutable (Getters/Setters) | Ninguna. Java puro | Modelos lógicos internos o clases base |
| Entidad JPA | Una fila exacta en una tabla SQL real | Mutable (lo rastrea el ORM) | @Entity, @Table, @Id |
Persistencia y comunicación directa con BD |
| DTO | Contenedor plano para transportar datos | Generalmente inmutable | Ninguna o anotaciones Jackson | Enviar datos a la API Web (Frontend) |
| Value Object (VO) | Un valor exacto medible (sin ID conceptual) | Inmutable por definición | record (Java 14+) |
Representar Dinero, Email, Direcciones |
| DAO / Repository | Clase de servicio (no guarda datos propios) | No aplica (componente lógico) | @Repository o interfaces Spring Data |
Contener métodos SQL (SELECT, INSERT, DELETE) |
📖 Análisis Detallado
1️⃣ DTO (Data Transfer Object)
Filtra u optimiza la información que viaja hacia afuera del sistema. Útil para unir datos de múltiples tablas sin exponer la estructura interna.
public class UserDTO {
private String username;
private String email;
// sin contraseñas ni IDs internos
}
2️⃣ Value Object (VO)
Dos objetos son idénticos si sus valores son iguales. No tienen identidad propia (no tienen ID). Implementación inmutable con record.
public record Dinero(
BigDecimal cantidad,
String divisa
) {}
3️⃣ DAO / Repository
Clase encargada de abrir conexiones y ejecutar consultas. Separa la lógica de acceso a datos del resto de la aplicación.
public class ProductRepository {
public List<Product> findAll() {
// SELECT * FROM products
}
}
4️⃣ POJO (Plain Old Java Object)
Clase Java sin dependencias de frameworks. Es la base de todos los objetos, sin anotaciones ni herencias forzadas.
public class Persona {
private String nombre;
private int edad;
// getters y setters
}
5️⃣ Entidad JPA
Representa una tabla real en la base de datos. Se mapea con anotaciones JPA y se usa con Hibernate o EclipseLink.
@Entity
@Table(name = "usuarios")
public class Usuario {
@Id
private Long id;
private String nombre;
}