Crea una primera versió de l'esquema de la base de dades. Les migracions de l'esquema de la base de dades es
defineixen creant arxius al directori resources/db/migration/. El nom d'aquests arxius ha
de seguir una nomenclatura específica (veure: migrations#naming)
CREATETABLEIFNOTEXISTS movie (
movieid uuid NOTNULLDEFAULT gen_random_uuid()PRIMARYKEY,
title text,
synopsis text,
imageurl text);CREATETABLEIFNOTEXISTS actor (
actorid uuid NOTNULLDEFAULT gen_random_uuid()PRIMARYKEY,
name text,
imageurl text);CREATETABLEIFNOTEXISTS genre (
genreid uuid NOTNULLDEFAULT gen_random_uuid()PRIMARYKEY,
label text);CREATETABLEIFNOTEXISTS movie_actor (
movieid uuid REFERENCES movie(movieid)ONDELETECASCADE,
actorid uuid REFERENCES actor(actorid)ONDELETECASCADE,PRIMARYKEY(movieid, actorid));CREATETABLEIFNOTEXISTS movie_genre (
movieid uuid REFERENCES movie(movieid)ONDELETECASCADE,
genreid uuid REFERENCES genre(genreid)ONDELETECASCADE,PRIMARYKEY(movieid, genreid));INSERTINTO movie(title, synopsis, imageurl)VALUES('Movie One','This is the One Movie','movie1.jpg'),('Movie Two','The Two Movie is the next','movie2.jpg'),('Movie Three','The Trilogy','movie3.jpg'),('Movie Four','Four movies is too much','movie4.jpg');INSERTINTO actor(name, imageurl)VALUES('Actor One','actor1.jpg'),('Actor Two','actor2.jpg'),('Actor Three','actor3.jpg'),('Actor Four','actor4.jpg'),('Actor Five','actor5.jpg');INSERTINTO genre(label)VALUES('Genre One'),('Genre Two'),('Genre Three');INSERTINTO movie_actor VALUES((SELECT movieid FROM movie WHERE title='Movie One'),(SELECT actorid FROM actor WHERE name='Actor One')),((SELECT movieid FROM movie WHERE title='Movie One'),(SELECT actorid FROM actor WHERE name='Actor Two')),((SELECT movieid FROM movie WHERE title='Movie Two'),(SELECT actorid FROM actor WHERE name='Actor Three')),((SELECT movieid FROM movie WHERE title='Movie Two'),(SELECT actorid FROM actor WHERE name='Actor Four')),((SELECT movieid FROM movie WHERE title='Movie Three'),(SELECT actorid FROM actor WHERE name='Actor Four')),((SELECT movieid FROM movie WHERE title='Movie Three'),(SELECT actorid FROM actor WHERE name='Actor Five')),((SELECT movieid FROM movie WHERE title='Movie Four'),(SELECT actorid FROM actor WHERE name='Actor One')),((SELECT movieid FROM movie WHERE title='Movie Four'),(SELECT actorid FROM actor WHERE name='Actor Four'));INSERTINTO movie_genre VALUES((SELECT movieid FROM movie WHERE title='Movie One'),(SELECT genreid FROM genre WHERE label='Genre One')),((SELECT movieid FROM movie WHERE title='Movie One'),(SELECT genreid FROM genre WHERE label='Genre Two')),((SELECT movieid FROM movie WHERE title='Movie Two'),(SELECT genreid FROM genre WHERE label='Genre One')),((SELECT movieid FROM movie WHERE title='Movie Three'),(SELECT genreid FROM genre WHERE label='Genre One')),((SELECT movieid FROM movie WHERE title='Movie Three'),(SELECT genreid FROM genre WHERE label='Genre Two')),((SELECT movieid FROM movie WHERE title='Movie Three'),(SELECT genreid FROM genre WHERE label='Genre Three'));
Spring boot API
L'arquitectura bàsica de la nostra ApiHttp amb Spring Boot serà aquesta:
Model
Les classes Model serveixen per a crear objectes amb les dades i així poder transportar-les d'un component a un altre.
curl -X POST -H "Content-Type: application/json" -d '{"username":"gerard", "password":"gerard123"}' http://localhost:8080/users/register/
Per últim caldrà decidir a quins endpoints caldrà estar autenticat per a accedir i quins no. Per exemple, podem donar accés al registre però
requerir autenticació per a tot lo demés:
Açò funcionarà per a les consultes que JPA derivades del nom: Query Methods
Relacions
@ManyToMany
En una relació ManyToMany entre dues entitats hem d'escollir primer una de les dos entitats com la "propietària" de la relació i l'altra com a "no-propietària".
A l'entitat "pripietària" definirem les anotacions @ManyToMany i @JoinTable:
Com la relació és bidireccional, quan la llibreria Jackson faci la serialització a JSON, es produeix una dependència circular (recursió infinita).
Podem tallar aquesta recursió amb l'anotació @JsonIgnoreProperties: