Spring Data no es una implementación de JPA, más bien es un proyecto que usa JPA para que la gestión de base de datos en Java sea mucho más sencilla, poderosa y llena de posibilidades.
Este proyecto internamente contiene otros, por ejemplo Spring Data o Spring Data JDBC.
JPA
JPA es una especificación de Java, es decir, es un estándar para un framework ORM. De esta manera se deben seguir una serie de reglas para poder interactuar con la BD.
Para poder interactuar con la base de datos mediante un lenguaje de programación orientado a objetos se usa la técnica ORM (no es un patrón de diseño). JPA es una especificación o estándar que menciona las reglas que se deben seguir para que pueda existir la interacción con las tablas de la base de datos en forma de objetos, usando la técnica ORM. En otras palabras, JPA es la teoría y algunas de las implementaciones de esta teoría son: Hibernate, EclipseLink, TopLink.
JPA usa anotaciones para evitar usar de manera nativa sentencias SQL. Las anotaciones más comunes son:
- @Entity: indica a una clase de java que está representando una tabla de nuestra BD.
- @Table: recibe el nombre de la tabla a la cual está mapeando la clase.
- @column: se le asigna a los atributos de la clase, no es obligatoria, se indica sólo cuando el nombre de la columna es diferente al nombre del atributo de la tabla.
- @id y @EmbededID: es el atributo como llave primaria de la tabla dentro de la clase. @id se utiliza cuando es llave primaria sencilla y @EmbededID cuando es una llave primaria compuesta (esta sera una clave embebida con @Embeddable).
- @GeneratedValue: permite generar automáticamente valores para atributos de la base de datos que lo requieran, por ejemplo, un identificador.
- @OneToMany y @MatyToOne: permite relacionar diferentes entidades/clases. También se hace uso de las anotaciones @JoinColumn.
Spring Data Repositories
Los repositorios de Spring Data permiten ahorrar código y tiempo de implementación al poder realizar operaciones en la base de datos sin sentencias SQL. Existen diferentes repositorios en Spring Data, por ejemplo:
- CrudRepository: para realizar operaciones CRUD.
- PagindAndSortingRepository: además de las operaciones CRUD, se puede paginar y ordenar.
- JPARepository: agregá tareas específicas a las anteriores, como flush.
A la clase que interactúa con la base de datos mediante una instancia de un repositorio, se le debe agregar alguna de las siguientes anotaciones:
- @Repository: le indicamos a la clase que es la encarga de interactuar con la base de datos.
- @Component: le indicamos que es un componente de spring.
El primero es mejor porque indicamos el tipo de componente que es.
Para orientar los repositorios al dominio se usan las clases (del dominio) y mapeadores del dominio.
Query Methods
Cuando se necesitan consultas y el repositorio de Spring Data no puede hacer estas consultas, entonces los Query Method proveen la posibilidad de generar consultas mediante el nombre de los métodos. Además son compatibles con programación funcional de Java.
En lugar de usar Query Methods, se puede usar la anotación @Query para escribir consultas (select * from tabla where condición).
¿Cómo conectar la aplicación con nuestra base de datos?
Se debe descargar y configurar el driver del sistema manejador de datos, por ejemplo PostgresSQL JDBC Driver. Después – de acuerdo al perfil – se configura agregando las siguientes lineas al archivo application.properties.
spring.datasource.url=spring.datasource.username=spring.datasource.password=
Patrón Data Mapper
Este patrón permite hacer una traducción o conversión de los atributos de una clase a otra; tiene como ventajas:
- No exponer la base de datos en la API.
- Desacoplar el API de una base de datos puntual.
- Evitar campos innecesarios en el API.
- Evitar mezclar idiomas en la aplicación.
- Permite orientar la aplicación en términos del dominio; como lo dicta la arquitectura DDD. Si se ocupa directamente la traducción – con la técnica ORM – de la base de datos y Java, entonces sería orientado a la persistencia.
MapStruct usa esta patrón de diseño, y sus anotaciones para las entidades son:
- @Mapper(componentModel = “spring”, uses = {ClaseDestino.class}): indica que clase va ser mapeada.
- @Mappings({@Mapping(source = “atributoFuente”, target = “atributoDestino”)… @Mapping(…)}): indica el mapeo de los atributos a mapear.
Comentarios
Publicar un comentario