From 92dafa3aae15145331e35d76f6ecc6cddded3c02 Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Sun, 11 Jan 2026 16:22:26 +0100 Subject: [PATCH 1/8] Refactor Loan entity: use relations instead of redundant ID:s --- src/main/java/org/example/Loan.java | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/example/Loan.java b/src/main/java/org/example/Loan.java index e9f14982..94d23e27 100644 --- a/src/main/java/org/example/Loan.java +++ b/src/main/java/org/example/Loan.java @@ -1,11 +1,7 @@ package org.example; import jakarta.persistence.*; - import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; @Entity public class Loan { @@ -16,27 +12,24 @@ public class Loan { private ZonedDateTime loanDate; private ZonedDateTime returnDate; - private Long userId; - private Long bookId; public Loan(){ } - - public Long getBookId() { - return bookId; + public User getUser() { + return user; } - public void setBookId(Long bookId) { - this.bookId = bookId; + public void setUser(User user){ + this.user = user; } - public Long getUserId() { - return userId; + public Book getBook() { + return book; } - public void setUserId(Long userId) { - this.userId = userId; + public void setBook(Book book){ + this.book = book; } public ZonedDateTime getReturnDate() { From 305af00dcd5a81b65f17d7d3c12869f2eb36c4b9 Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Sun, 11 Jan 2026 18:13:05 +0100 Subject: [PATCH 2/8] Create LoanServices class --- src/main/java/org/example/LoanServices.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/org/example/LoanServices.java diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java new file mode 100644 index 00000000..45554472 --- /dev/null +++ b/src/main/java/org/example/LoanServices.java @@ -0,0 +1,4 @@ +package org.example; + +public class LoanServices { +} From fcc8dd753c66bfd3a92d3a5ed1a1be1f2eaa9cf8 Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Sun, 11 Jan 2026 19:06:08 +0100 Subject: [PATCH 3/8] Add isBookLoaned method --- src/main/java/org/example/LoanServices.java | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index 45554472..64c8f6ab 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -1,4 +1,29 @@ package org.example; +import jakarta.persistence.EntityManager; +import java.util.List; + public class LoanServices { + + final private EntityManager em; + + public LoanServices(EntityManager em) { + this.em = em; + } + + public boolean isBookLoaned(Long bookId) { + + List loans = em.createQuery( + "SELECT l FROM Loan l WHERE l.bookId = :bookId AND l.returnDate IS NULL", + Loan.class + ) + .setParameter("bookId", bookId) + .getResultList(); + + if (loans.isEmpty()) { + return false; + } else { + return true; + } + } } From 3561cfcf3040075067feb5cd3d317324938653ab Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Mon, 12 Jan 2026 09:02:35 +0100 Subject: [PATCH 4/8] Add loanBook method --- src/main/java/org/example/LoanServices.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index 64c8f6ab..d21c83e0 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -1,6 +1,7 @@ package org.example; import jakarta.persistence.EntityManager; +import java.time.ZonedDateTime; import java.util.List; public class LoanServices { @@ -26,4 +27,23 @@ public boolean isBookLoaned(Long bookId) { return true; } } + + public boolean loanBook(Long bookId, Long userId) { + + if (isBookLoaned(bookId)) { + return false; + } + + User user = em.find(User.class, userId); + Book book = em.find(Book.class, bookId); + + Loan loan = new Loan(); + + loan.setUser(user); + loan.setBook(book); + loan.setLoanDate(ZonedDateTime.now()); + loan.setReturnDate(null); + em.persist(loan); + return true; + } } From abd5d08094300688225f4e0f1c11952372b7052f Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Mon, 12 Jan 2026 09:07:50 +0100 Subject: [PATCH 5/8] Update isBookLoaned to use Book relation --- src/main/java/org/example/LoanServices.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index d21c83e0..54fcb00a 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -15,7 +15,7 @@ public LoanServices(EntityManager em) { public boolean isBookLoaned(Long bookId) { List loans = em.createQuery( - "SELECT l FROM Loan l WHERE l.bookId = :bookId AND l.returnDate IS NULL", + "SELECT l FROM Loan l WHERE l.book.bookId = :bookId AND l.returnDate IS NULL", Loan.class ) .setParameter("bookId", bookId) From 319e84d8d86a0a9e9c77e5b370c19558087b99dd Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Mon, 12 Jan 2026 09:48:50 +0100 Subject: [PATCH 6/8] Add getter and setter for loan relation in Book --- src/main/java/org/example/Book.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/example/Book.java b/src/main/java/org/example/Book.java index 047260c7..da932078 100644 --- a/src/main/java/org/example/Book.java +++ b/src/main/java/org/example/Book.java @@ -64,6 +64,15 @@ public void setTitle(String title) { public Long getId() { return bookId; } + + public Loan getLoan() { + return loan; + } + + public void setLoan(Loan loan) { + this.loan = loan; + } + @ManyToMany @JoinTable(name = "book_author", joinColumns = @JoinColumn(name = "bookId")) From 5f1b6aa245ff56c2be27c0e871e4a849eb3a716b Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Mon, 12 Jan 2026 09:53:10 +0100 Subject: [PATCH 7/8] Add returnBook method --- src/main/java/org/example/LoanServices.java | 24 +++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index 54fcb00a..bb15510c 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -46,4 +46,28 @@ public boolean loanBook(Long bookId, Long userId) { em.persist(loan); return true; } + + public boolean returnBook(User user, Book book) { + + Loan loan = em.createQuery( + "SELECT l FROM Loan l WHERE l.user = :user AND l.book = :book AND l.returnDate IS NULL", + Loan.class + ) + .setParameter("user", user) + .setParameter("book", book) + .getResultStream() + .findFirst() + .orElse(null); + + if (loan == null) { + return false; + } + + em.getTransaction().begin(); + + loan.setReturnDate(ZonedDateTime.now()); + book.setLoan(null); + em.getTransaction().commit(); + return true; + } } From 74045ae36dd0a0b54a6c6c96ca0efbaa952f3a65 Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Mon, 12 Jan 2026 09:54:33 +0100 Subject: [PATCH 8/8] Add comments --- src/main/java/org/example/LoanServices.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/example/LoanServices.java b/src/main/java/org/example/LoanServices.java index bb15510c..567e34d4 100644 --- a/src/main/java/org/example/LoanServices.java +++ b/src/main/java/org/example/LoanServices.java @@ -12,6 +12,7 @@ public LoanServices(EntityManager em) { this.em = em; } + // Kolla om en bok är utlånad public boolean isBookLoaned(Long bookId) { List loans = em.createQuery( @@ -28,6 +29,7 @@ public boolean isBookLoaned(Long bookId) { } } + // Låna en bok public boolean loanBook(Long bookId, Long userId) { if (isBookLoaned(bookId)) { @@ -47,6 +49,7 @@ public boolean loanBook(Long bookId, Long userId) { return true; } + // Lämna tillbak en bok public boolean returnBook(User user, Book book) { Loan loan = em.createQuery(