diff --git a/Uebung02_Jpa.pdf b/Uebung02_Jpa.pdf index 062e66f..1fa5c23 100644 Binary files a/Uebung02_Jpa.pdf and b/Uebung02_Jpa.pdf differ diff --git a/Uebung03_Jpa.pdf b/Uebung03_Jpa.pdf new file mode 100644 index 0000000..f2d74ff Binary files /dev/null and b/Uebung03_Jpa.pdf differ diff --git a/Uebung04_Jpa.pdf b/Uebung04_Jpa.pdf new file mode 100644 index 0000000..5b9f576 Binary files /dev/null and b/Uebung04_Jpa.pdf differ diff --git a/movierental.jpa/.project b/movierental.jpa/.project index d4ad6b4..734a74b 100644 --- a/movierental.jpa/.project +++ b/movierental.jpa/.project @@ -15,6 +15,11 @@ + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + org.eclipse.jdt.core.javanature diff --git a/movierental.jpa/.settings/org.springframework.ide.eclipse.prefs b/movierental.jpa/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000..a12794d --- /dev/null +++ b/movierental.jpa/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/movierental.jpa/bin/main/application.properties b/movierental.jpa/bin/main/application.properties index 9d88b9b..963de98 100644 --- a/movierental.jpa/bin/main/application.properties +++ b/movierental.jpa/bin/main/application.properties @@ -5,6 +5,8 @@ spring.h2.console.path=/h2 spring.datasource.url=jdbc:h2:mem:testdb +spring.jpa.show-sql=true + # spring.datasource.url= # spring.datasource.driver-class-name= # spring.datasource.username=sa @@ -12,4 +14,3 @@ spring.datasource.url=jdbc:h2:mem:testdb # logging.level.org.hibernate.SQL: DEBUG # spring.jpa.hibernate.ddl-auto=create -# spring.jpa.show-sql=true diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Movie.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Movie.class index e85ae28..427f03e 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Movie.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Movie.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategory.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategory.class index 80ae3ad..0c1ea39 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategory.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategory.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryChildren.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryChildren.class index 69222d3..9371507 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryChildren.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryChildren.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.class index 12e9abc..e6f5eba 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryRegular.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryRegular.class index 9329cf4..923fe8e 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryRegular.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/PriceCategoryRegular.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Rental.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Rental.class index f9ff827..9a9624c 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Rental.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/Rental.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/User.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/User.class index 23c78a6..3d03a98 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/User.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/model/User.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.class index 6ea4979..e9934db 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.class index ab214ca..dbe51ec 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.class index 0ee28c8..9070391 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.class differ diff --git a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.class b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.class index c623ca1..ca884f7 100644 Binary files a/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.class and b/movierental.jpa/bin/main/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.class differ diff --git a/movierental.jpa/bin/main/data.sql b/movierental.jpa/bin/main/data.sql index e7dd80b..0006ac1 100644 --- a/movierental.jpa/bin/main/data.sql +++ b/movierental.jpa/bin/main/data.sql @@ -29,6 +29,7 @@ INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (1, 'K INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (2, 'Knecht', 'Werner', 'werner.knecht@gmail.com'); INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (3, 'Meyer', 'Barbara', 'barbara.meyer@gmail.com'); INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (4, 'Kummer', 'Adolf', 'adolf.kummer@gmail.com'); +INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (5, 'Naef', 'Livio', 'livio.naef@students.fhnw.ch'); INSERT INTO RENTALS (RENTAL_ID, MOVIE_ID, USER_ID, RENTAL_RENTALDATE, RENTAL_RENTALDAYS) VALUES (1, 1, 1, '2019-09-28', 14); INSERT INTO RENTALS (RENTAL_ID, MOVIE_ID, USER_ID, RENTAL_RENTALDATE, RENTAL_RENTALDAYS) VALUES (2, 2, 1, '2019-09-30', 14); diff --git a/movierental.jpa/bin/test/ch/fhnw/eaf/rental/services/UserServiceTest.class b/movierental.jpa/bin/test/ch/fhnw/eaf/rental/services/UserServiceTest.class index cf92151..74d94fa 100644 Binary files a/movierental.jpa/bin/test/ch/fhnw/eaf/rental/services/UserServiceTest.class and b/movierental.jpa/bin/test/ch/fhnw/eaf/rental/services/UserServiceTest.class differ diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Movie.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Movie.java index 7e01e0b..0144bae 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Movie.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Movie.java @@ -2,14 +2,40 @@ import java.time.LocalDate; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "MOVIES") public class Movie { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="MOVIE_ID") private Long id; + @Column(name="MOVIE_TITLE") private String title; + + @Column(name="MOVIE_RELEASEDATE") private LocalDate releaseDate; + + @Column(name="MOVIE_RENTED") private boolean rented; + + @ManyToOne // Movie is the owner of the relationship + @JoinColumn(name="PRICECATEGORY_FK") private PriceCategory priceCategory; + // nicht-privater no-arg Konstruktor (jede @Entity Klasse braucht diesen) + protected Movie() { } + public Movie(Long id, String title, LocalDate releaseDate, boolean rented, PriceCategory priceCategory) { this(title, releaseDate, priceCategory); setId(id); diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategory.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategory.java index 02be5b6..57ebae3 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategory.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategory.java @@ -1,5 +1,13 @@ package ch.fhnw.eaf.rental.model; +import javax.persistence.Column; +import javax.persistence.DiscriminatorColumn; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -8,8 +16,18 @@ @JsonDeserialize(using = PriceCategoryDeserializer.class) @JsonSerialize(using = PriceCategorySerializer.class) +@Entity +@Table(name = "PRICECATEGORIES") +@DiscriminatorColumn(name="PRICECATEGORY_TYPE") // default DTYPE public abstract class PriceCategory { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="PRICECATEGORY_ID") private Long id; + + // nicht-privater no-arg Konstruktor + protected PriceCategory() { } public Long getId() { return id; diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryChildren.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryChildren.java index 631de23..0cbecf3 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryChildren.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryChildren.java @@ -1,5 +1,10 @@ package ch.fhnw.eaf.rental.model; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue(value="Children") public class PriceCategoryChildren extends PriceCategory { @Override diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.java index 723179e..f1da83e 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryNewRelease.java @@ -1,5 +1,10 @@ package ch.fhnw.eaf.rental.model; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue(value="NewRelease") public class PriceCategoryNewRelease extends PriceCategory { @Override diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryRegular.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryRegular.java index c4ef85e..462f439 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryRegular.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/PriceCategoryRegular.java @@ -1,5 +1,10 @@ package ch.fhnw.eaf.rental.model; +import javax.persistence.DiscriminatorValue; +import javax.persistence.Entity; + +@Entity +@DiscriminatorValue(value="Regular") public class PriceCategoryRegular extends PriceCategory { @Override diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Rental.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Rental.java index df55993..4f4ed79 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Rental.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/Rental.java @@ -2,18 +2,44 @@ import java.time.LocalDate; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.Table; + import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Rental.class) +@Entity +@Table(name = "RENTALS") public class Rental { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="RENTAL_ID") private Long id; + @OneToOne + @JoinColumn(name="MOVIE_ID") private Movie movie; + + @ManyToOne // Rental is the owner of the relationship + @JoinColumn(name="USER_ID") private User user; + + @Column(name="RENTAL_RENTALDATE") private LocalDate rentalDate; + + @Column(name="RENTAL_RENTALDAYS") private int rentalDays; + // nicht-privater no-arg Konstruktor public Rental() { this.rentalDate = LocalDate.now(); } diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/User.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/User.java index 7417ad6..09417fc 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/User.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/model/User.java @@ -3,17 +3,41 @@ import java.util.ArrayList; import java.util.List; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; + import com.fasterxml.jackson.annotation.JsonIdentityInfo; import com.fasterxml.jackson.annotation.ObjectIdGenerators; @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Rental.class) +@Entity +@Table(name = "USERS") public class User { + + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + @Column(name="USER_ID") private Long id; + @Column(name="USER_NAME") private String lastName; + + @Column(name="USER_FIRSTNAME") private String firstName; + + @Column(name="USER_EMAIL") private String email; + + @OneToMany(mappedBy="user", cascade = CascadeType.REMOVE) private List rentals; + + // nicht-privater no-arg Konstruktor + protected User() { } public User(String lastName, String firstName) { this.lastName = lastName; diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.java index 4d8def2..e7621ba 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaMovieRepository.java @@ -3,6 +3,10 @@ import java.util.List; import java.util.Optional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; + import org.springframework.stereotype.Repository; import ch.fhnw.eaf.rental.model.Movie; @@ -10,53 +14,58 @@ @Repository public class JpaMovieRepository implements MovieRepository { + + @PersistenceContext + private EntityManager em; @Override public Optional findById(Long id) { - // TODO Auto-generated method stub - return null; + return Optional.ofNullable(em.find(Movie.class, id)); } @Override public List findAll() { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery("SELECT m FROM Movie m", Movie.class); + return query.getResultList(); } @Override - public Movie save(Movie t) { - // TODO Auto-generated method stub - return null; + public Movie save(Movie movie) { + return em.merge(movie); } @Override public void deleteById(Long id) { - // TODO Auto-generated method stub - + em.remove(em.getReference(Movie.class, id)); } @Override - public void delete(Movie entity) { - // TODO Auto-generated method stub - + public void delete(Movie movie) { + em.remove(em.merge(movie)); } @Override public boolean existsById(Long id) { - // TODO Auto-generated method stub - return false; +// return findById(id).isPresent(); -> Entität wird in Persistenzkontext geladen! + TypedQuery query = em.createQuery( + "SELECT COUNT(m) FROM Movie m WHERE m.id = :id", + Long.class); + query.setParameter("id", id); + return query.getSingleResult() > 0; // -> Entität wird nicht in Persistenzkontext geladen! } @Override public long count() { - // TODO Auto-generated method stub - return 0; + return em.createQuery("SELECT COUNT(m) FROM Movie m", Long.class).getSingleResult(); } @Override public List findByTitle(String title) { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery( + "SELECT m FROM Movie m WHERE m.title = :title", + Movie.class); + query.setParameter("title", title); + return query.getResultList(); } } diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.java index 8e8387b..86643a4 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaPriceCategoryRepository.java @@ -3,6 +3,10 @@ import java.util.List; import java.util.Optional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; + import org.springframework.stereotype.Repository; import ch.fhnw.eaf.rental.model.PriceCategory; @@ -10,47 +14,49 @@ @Repository public class JpaPriceCategoryRepository implements PriceCategoryRepository { + + @PersistenceContext + private EntityManager em; @Override public Optional findById(Long id) { - // TODO Auto-generated method stub - return null; + return Optional.ofNullable(em.find(PriceCategory.class, id)); } @Override public List findAll() { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery("SELECT pc FROM PriceCategory pc", PriceCategory.class); + return query.getResultList(); } @Override - public PriceCategory save(PriceCategory t) { - // TODO Auto-generated method stub - return null; + public PriceCategory save(PriceCategory priceCategory) { + return em.merge(priceCategory); } @Override public void deleteById(Long id) { - // TODO Auto-generated method stub - + em.remove(em.getReference(PriceCategory.class, id)); } @Override - public void delete(PriceCategory entity) { - // TODO Auto-generated method stub - + public void delete(PriceCategory priceCategory) { + em.remove(em.merge(priceCategory)); } @Override public boolean existsById(Long id) { - // TODO Auto-generated method stub - return false; +// return findById(id).isPresent(); + TypedQuery query = em.createQuery( + "SELECT COUNT(pc) FROM PriceCategory pc WHERE pc.id = :id", + Long.class); + query.setParameter("id", id); + return query.getSingleResult() > 0; } @Override public long count() { - // TODO Auto-generated method stub - return 0; + return em.createQuery("SELECT COUNT(pc) FROM PriceCategory pc", Long.class).getSingleResult(); } } diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.java index 76fea25..b08dc67 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaRentalRepository.java @@ -3,6 +3,10 @@ import java.util.List; import java.util.Optional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; + import org.springframework.stereotype.Repository; import ch.fhnw.eaf.rental.model.Rental; @@ -11,53 +15,54 @@ @Repository public class JpaRentalRepository implements RentalRepository { + + @PersistenceContext + private EntityManager em; @Override public Optional findById(Long id) { - // TODO Auto-generated method stub - return null; + return Optional.ofNullable(em.find(Rental.class, id)); } @Override public List findAll() { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery("SELECT r FROM Rental r", Rental.class); + return query.getResultList(); } @Override - public Rental save(Rental t) { - // TODO Auto-generated method stub - return null; + public Rental save(Rental rental) { + return em.merge(rental); } @Override public void deleteById(Long id) { - // TODO Auto-generated method stub - + em.remove(em.getReference(Rental.class, id)); } @Override - public void delete(Rental entity) { - // TODO Auto-generated method stub - + public void delete(Rental rental) { + em.remove(rental); } @Override public boolean existsById(Long id) { - // TODO Auto-generated method stub - return false; +// return findById(id).isPresent(); + TypedQuery query = em.createQuery( + "SELECT COUNT(r) FROM Rental r WHERE r.id = :id", + Long.class); + query.setParameter("id", id); + return query.getSingleResult() > 0; } @Override public long count() { - // TODO Auto-generated method stub - return 0; + return em.createQuery("SELECT COUNT(r) FROM Rental r", Long.class).getSingleResult(); } @Override public List findByUser(User user) { - // TODO Auto-generated method stub - return null; + return user.getRentals(); } } diff --git a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.java b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.java index 7978e88..03f100b 100644 --- a/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.java +++ b/movierental.jpa/src/main/java/ch/fhnw/eaf/rental/persistence/impl/JpaUserRepository.java @@ -3,6 +3,10 @@ import java.util.List; import java.util.Optional; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; + import org.springframework.stereotype.Repository; import ch.fhnw.eaf.rental.model.User; @@ -10,65 +14,76 @@ @Repository public class JpaUserRepository implements UserRepository { + + @PersistenceContext + private EntityManager em; @Override public Optional findById(Long id) { - // TODO Auto-generated method stub - return null; + return Optional.ofNullable(em.find(User.class, id)); } @Override public List findAll() { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery("SELECT u FROM User u", User.class); + return query.getResultList(); } @Override - public User save(User t) { - // TODO Auto-generated method stub - return null; + public User save(User user) { + return em.merge(user); } @Override public void deleteById(Long id) { - // TODO Auto-generated method stub - + em.remove(em.getReference(User.class, id)); } @Override - public void delete(User entity) { - // TODO Auto-generated method stub - + public void delete(User user) { + em.remove(user); } @Override public boolean existsById(Long id) { - // TODO Auto-generated method stub - return false; +// return findById(id).isPresent(); + TypedQuery query = em.createQuery( + "SELECT COUNT(u) FROM User u WHERE u.id = :id", + Long.class); + query.setParameter("id", id); + return query.getSingleResult() > 0; } @Override public long count() { - // TODO Auto-generated method stub - return 0; + return em.createQuery("SELECT COUNT(u) FROM User u", Long.class).getSingleResult(); } @Override public List findByLastName(String lastName) { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery( + "SELECT u FROM User u WHERE u.lastName = :lastName", + User.class); + query.setParameter("lastName", lastName); + return query.getResultList(); } @Override public List findByFirstName(String firstName) { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery( + "SELECT u FROM User u WHERE u.firstName = :firstName", + User.class); + query.setParameter("firstName", firstName); + return query.getResultList(); } @Override public List findByEmail(String email) { - // TODO Auto-generated method stub - return null; + TypedQuery query = em.createQuery( + "SELECT u FROM User u WHERE u.email = :email", + User.class); + query.setParameter("email", email); + return query.getResultList(); } } diff --git a/movierental.jpa/src/main/resources/application.properties b/movierental.jpa/src/main/resources/application.properties index 9d88b9b..963de98 100644 --- a/movierental.jpa/src/main/resources/application.properties +++ b/movierental.jpa/src/main/resources/application.properties @@ -5,6 +5,8 @@ spring.h2.console.path=/h2 spring.datasource.url=jdbc:h2:mem:testdb +spring.jpa.show-sql=true + # spring.datasource.url= # spring.datasource.driver-class-name= # spring.datasource.username=sa @@ -12,4 +14,3 @@ spring.datasource.url=jdbc:h2:mem:testdb # logging.level.org.hibernate.SQL: DEBUG # spring.jpa.hibernate.ddl-auto=create -# spring.jpa.show-sql=true diff --git a/movierental.jpa/src/main/resources/data.sql b/movierental.jpa/src/main/resources/data.sql index e7dd80b..0006ac1 100644 --- a/movierental.jpa/src/main/resources/data.sql +++ b/movierental.jpa/src/main/resources/data.sql @@ -29,6 +29,7 @@ INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (1, 'K INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (2, 'Knecht', 'Werner', 'werner.knecht@gmail.com'); INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (3, 'Meyer', 'Barbara', 'barbara.meyer@gmail.com'); INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (4, 'Kummer', 'Adolf', 'adolf.kummer@gmail.com'); +INSERT INTO USERS (USER_ID, USER_NAME, USER_FIRSTNAME, USER_EMAIL) VALUES (5, 'Naef', 'Livio', 'livio.naef@students.fhnw.ch'); INSERT INTO RENTALS (RENTAL_ID, MOVIE_ID, USER_ID, RENTAL_RENTALDATE, RENTAL_RENTALDAYS) VALUES (1, 1, 1, '2019-09-28', 14); INSERT INTO RENTALS (RENTAL_ID, MOVIE_ID, USER_ID, RENTAL_RENTALDATE, RENTAL_RENTALDAYS) VALUES (2, 2, 1, '2019-09-30', 14); diff --git a/movierental.jpa/src/test/java/ch/fhnw/eaf/rental/services/UserServiceTest.java b/movierental.jpa/src/test/java/ch/fhnw/eaf/rental/services/UserServiceTest.java index 9bb1be4..ae8037e 100644 --- a/movierental.jpa/src/test/java/ch/fhnw/eaf/rental/services/UserServiceTest.java +++ b/movierental.jpa/src/test/java/ch/fhnw/eaf/rental/services/UserServiceTest.java @@ -32,7 +32,7 @@ public class UserServiceTest { @Test public void testGetAllUsers() { List users = userService.getAllUsers(); - assertEquals(4, users.size()); + assertEquals(5, users.size()); } @Test @@ -42,7 +42,7 @@ public void testSaveUser() { user = userService.save(user); assertNotNull("id must be assigned after insertion into db", user.getId()); List users = userService.getAllUsers(); - assertEquals(5, users.size()); + assertEquals(6, users.size()); } @Test