From 844c86c3a24612cd4da7678ae2eba751d371db60 Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Tue, 16 May 2023 17:12:07 +0530 Subject: [PATCH 1/6] code implemented --- .../java/guru/springframework/spring5webapp/model/Author.java | 2 ++ .../java/guru/springframework/spring5webapp/model/Book.java | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/model/Author.java create mode 100644 src/main/java/guru/springframework/spring5webapp/model/Book.java diff --git a/src/main/java/guru/springframework/spring5webapp/model/Author.java b/src/main/java/guru/springframework/spring5webapp/model/Author.java new file mode 100644 index 0000000000..0f76c50053 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Author.java @@ -0,0 +1,2 @@ +package guru.springframework.spring5webapp;public class Author { +} diff --git a/src/main/java/guru/springframework/spring5webapp/model/Book.java b/src/main/java/guru/springframework/spring5webapp/model/Book.java new file mode 100644 index 0000000000..682447a020 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -0,0 +1,2 @@ +package guru.springframework.spring5webapp.model;public class Book { +} From 1a71d2088bd3712a2b663de29a5b541307ee61ae Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Tue, 16 May 2023 17:19:50 +0530 Subject: [PATCH 2/6] Models created --- .../spring5webapp/model/Author.java | 75 ++++++++++++++++++- .../spring5webapp/model/Book.java | 67 ++++++++++++++++- 2 files changed, 140 insertions(+), 2 deletions(-) diff --git a/src/main/java/guru/springframework/spring5webapp/model/Author.java b/src/main/java/guru/springframework/spring5webapp/model/Author.java index 0f76c50053..73a50a3f1e 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Author.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Author.java @@ -1,2 +1,75 @@ -package guru.springframework.spring5webapp;public class Author { +package guru.springframework.spring5webapp.model; + +import org.hibernate.annotations.GeneratorType; + +import javax.persistence.*; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String firstName; + private String lastName; + @ManyToMany(mappedBy = "authors") + private Set books; + + public Author(Long id) { + this.id = id; + } + + public Author(Long id, String firstName, String lastName, Set books) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.books = books; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + this.books = books; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Author author = (Author) o; + return Objects.equals(id, author.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } diff --git a/src/main/java/guru/springframework/spring5webapp/model/Book.java b/src/main/java/guru/springframework/spring5webapp/model/Book.java index 682447a020..80a98ccea5 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -1,2 +1,67 @@ -package guru.springframework.spring5webapp.model;public class Book { +package guru.springframework.spring5webapp.model; + +import javax.persistence.*; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private String isbn; + + @ManyToMany + @JoinTable(name = "author_book", + joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "author_id")) + private Set authors; + + public Book() { + } + + public Book(Long id, String title, String isbn) { + this.id = id; + this.title = title; + this.isbn = isbn; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(id, book.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } From fb1a410988f18250d4549ad8ecbdb7f202a952c3 Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Tue, 16 May 2023 17:28:22 +0530 Subject: [PATCH 3/6] Repository added --- .../spring5webapp/repository/AuthorRepository.java | 7 +++++++ .../spring5webapp/repository/BookRepository.java | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java new file mode 100644 index 0000000000..1577c85208 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.model.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java new file mode 100644 index 0000000000..477de46301 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.model.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} From b8ddfd8b87658de49cad9ca1736b50714856c9fe Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Tue, 16 May 2023 17:44:51 +0530 Subject: [PATCH 4/6] Sample data loaded --- .../bootstrap/BootStrapData.java | 46 +++++++++++++++++++ .../spring5webapp/model/Author.java | 10 ++-- .../spring5webapp/model/Book.java | 14 ++++-- 3 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java new file mode 100644 index 0000000000..a937ddc36d --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -0,0 +1,46 @@ +package guru.springframework.spring5webapp.bootstrap; + +import guru.springframework.spring5webapp.model.Author; +import guru.springframework.spring5webapp.model.Book; +import guru.springframework.spring5webapp.repository.AuthorRepository; +import guru.springframework.spring5webapp.repository.BookRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootStrapData implements CommandLineRunner { + + private final AuthorRepository authorRepository; + private final BookRepository bookRepository; + + public BootStrapData(AuthorRepository authorRepository, BookRepository bookRepository) { + this.authorRepository = authorRepository; + this.bookRepository = bookRepository; + } + + + @Override + public void run(String... args) throws Exception { + Author eric = new Author("Eric", "Evans"); + Book book = new Book("Book_Title_1", "123456789"); + + eric.getBooks().add(book); + book.getAuthors().add(eric); + + authorRepository.save(eric); + bookRepository.save(book); + + //--------------------------- + + Author auther1 = new Author("Eric", "Evans"); + Book book1 = new Book("Book_Title_1", "123456789"); + + auther1.getBooks().add(book1); + book1.getAuthors().add(auther1); + + authorRepository.save(auther1); + bookRepository.save(book1); + + System.out.println("Number of books loaded: "+bookRepository.count()); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/model/Author.java b/src/main/java/guru/springframework/spring5webapp/model/Author.java index 73a50a3f1e..11eaf88fd6 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Author.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Author.java @@ -3,6 +3,7 @@ import org.hibernate.annotations.GeneratorType; import javax.persistence.*; +import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -15,17 +16,14 @@ public class Author { private String firstName; private String lastName; @ManyToMany(mappedBy = "authors") - private Set books; + private Set books = new HashSet<>(); - public Author(Long id) { - this.id = id; + public Author() { } - public Author(Long id, String firstName, String lastName, Set books) { - this.id = id; + public Author(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; - this.books = books; } public Long getId() { diff --git a/src/main/java/guru/springframework/spring5webapp/model/Book.java b/src/main/java/guru/springframework/spring5webapp/model/Book.java index 80a98ccea5..9bf1b3b959 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -1,6 +1,7 @@ package guru.springframework.spring5webapp.model; import javax.persistence.*; +import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -17,13 +18,20 @@ public class Book { @JoinTable(name = "author_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "author_id")) - private Set authors; + private Set authors = new HashSet<>(); public Book() { } - public Book(Long id, String title, String isbn) { - this.id = id; + public Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + + public Book(String title, String isbn) { this.title = title; this.isbn = isbn; } From d657887d2f1bc6638ef3b2b327c61c32f3006583 Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Wed, 17 May 2023 11:13:31 +0530 Subject: [PATCH 5/6] Publisher relationship added --- .../bootstrap/BootStrapData.java | 21 ++++- .../spring5webapp/model/Book.java | 12 +++ .../spring5webapp/model/Publisher.java | 85 +++++++++++++++++++ .../repository/PublisherRepository.java | 7 ++ 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/model/Publisher.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java index a937ddc36d..bf8168ad24 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -2,8 +2,10 @@ import guru.springframework.spring5webapp.model.Author; import guru.springframework.spring5webapp.model.Book; +import guru.springframework.spring5webapp.model.Publisher; import guru.springframework.spring5webapp.repository.AuthorRepository; import guru.springframework.spring5webapp.repository.BookRepository; +import guru.springframework.spring5webapp.repository.PublisherRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @@ -13,22 +15,37 @@ public class BootStrapData implements CommandLineRunner { private final AuthorRepository authorRepository; private final BookRepository bookRepository; - public BootStrapData(AuthorRepository authorRepository, BookRepository bookRepository) { + private final PublisherRepository publisherRepository; + + public BootStrapData(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) { this.authorRepository = authorRepository; this.bookRepository = bookRepository; + this.publisherRepository = publisherRepository; } @Override public void run(String... args) throws Exception { + + Publisher publisher = new Publisher(); + publisher.setName("P1"); + publisher.setCity("C1"); + publisher.setState("S1"); + + publisherRepository.save(publisher); + Author eric = new Author("Eric", "Evans"); Book book = new Book("Book_Title_1", "123456789"); eric.getBooks().add(book); book.getAuthors().add(eric); + book.setPublisher(publisher); + publisher.getBooks().add(book); + authorRepository.save(eric); bookRepository.save(book); + publisherRepository.save(publisher); //--------------------------- @@ -42,5 +59,7 @@ public void run(String... args) throws Exception { bookRepository.save(book1); System.out.println("Number of books loaded: "+bookRepository.count()); + System.out.println("Number of authors loaded: "+authorRepository.count()); + System.out.println("Number of publisher loaded: "+publisherRepository.count()); } } diff --git a/src/main/java/guru/springframework/spring5webapp/model/Book.java b/src/main/java/guru/springframework/spring5webapp/model/Book.java index 9bf1b3b959..ca5e150d34 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -14,12 +14,24 @@ public class Book { private String title; private String isbn; + @ManyToOne + private Publisher publisher; + @ManyToMany @JoinTable(name = "author_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "author_id")) private Set authors = new HashSet<>(); + + public Publisher getPublisher() { + return publisher; + } + + public void setPublisher(Publisher publisher) { + this.publisher = publisher; + } + public Book() { } diff --git a/src/main/java/guru/springframework/spring5webapp/model/Publisher.java b/src/main/java/guru/springframework/spring5webapp/model/Publisher.java new file mode 100644 index 0000000000..44db9b0ed1 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Publisher.java @@ -0,0 +1,85 @@ +package guru.springframework.spring5webapp.model; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Publisher { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + private String city; + private String state; + + @OneToMany + @JoinColumn(name = "publisher_id") + private Set books = new HashSet<>(); + + public Publisher() { + } + + public Publisher(String name, String city, String state, Set books) { + this.name = name; + this.city = city; + this.state = state; + this.books = books; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + this.books = books; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Publisher publisher = (Publisher) o; + return Objects.equals(id, publisher.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java new file mode 100644 index 0000000000..5c35add58f --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.model.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository { +} From 58c740b64389434327587f8caf1e1b96570a9261 Mon Sep 17 00:00:00 2001 From: Onkar Agnihotri Date: Thu, 18 May 2023 15:13:27 +0530 Subject: [PATCH 6/6] Thymleaf UI added --- .../bootstrap/BootStrapData.java | 12 ++++++++++ .../controller/BookController.java | 22 +++++++++++++++++ src/main/resources/application.properties | 1 + src/main/resources/templates/list.html | 24 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/controller/BookController.java create mode 100644 src/main/resources/templates/list.html diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java index bf8168ad24..53c57a0736 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -42,6 +42,7 @@ public void run(String... args) throws Exception { book.setPublisher(publisher); publisher.getBooks().add(book); + System.out.println(book.getPublisher().getName()); authorRepository.save(eric); bookRepository.save(book); @@ -49,14 +50,25 @@ public void run(String... args) throws Exception { //--------------------------- + Publisher publisher2 = new Publisher(); + publisher.setName("P2"); + publisher.setCity("C2"); + publisher.setState("S2"); + + publisherRepository.save(publisher2); + Author auther1 = new Author("Eric", "Evans"); Book book1 = new Book("Book_Title_1", "123456789"); auther1.getBooks().add(book1); book1.getAuthors().add(auther1); + book.setPublisher(publisher2); + publisher2.getBooks().add(book1); + authorRepository.save(auther1); bookRepository.save(book1); + publisherRepository.save(publisher2); System.out.println("Number of books loaded: "+bookRepository.count()); System.out.println("Number of authors loaded: "+authorRepository.count()); diff --git a/src/main/java/guru/springframework/spring5webapp/controller/BookController.java b/src/main/java/guru/springframework/spring5webapp/controller/BookController.java new file mode 100644 index 0000000000..98af950ba0 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controller/BookController.java @@ -0,0 +1,22 @@ +package guru.springframework.spring5webapp.controller; + +import guru.springframework.spring5webapp.repository.BookRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class BookController { + + private final BookRepository bookRepository; + + public BookController(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + @RequestMapping("/books") + public String getBooks(Model model){ + model.addAttribute("books", bookRepository.findAll()); + return "list"; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb2..0db082b821 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.h2.console.enabled=true diff --git a/src/main/resources/templates/list.html b/src/main/resources/templates/list.html new file mode 100644 index 0000000000..748b6c2b0b --- /dev/null +++ b/src/main/resources/templates/list.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Book List

+ + + + + + + + + + + + +
IDTitlePublisher
123 Spring in ActionWrox
+ + + \ No newline at end of file