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