From eea1b11d851ba03f898e903f9a3a0b9f521b3499 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jun 2018 15:58:12 +0530 Subject: [PATCH 1/5] adding JPA use case --- .../spring5webapp/model/Author.java | 74 +++++++++++++ .../spring5webapp/model/Book.java | 101 ++++++++++++++++++ src/main/resources/application.properties | 1 + 3 files changed, 176 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..89bc65e9ff --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Author.java @@ -0,0 +1,74 @@ +package guru.springframework.spring5webapp.model; + +import javax.persistence.*; +import java.util.HashSet; +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 = new HashSet<>(); + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + 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; + } + + @Override + public boolean equals(Object o) { + + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Author author = (Author) o; + + return id != null ? id.equals(author.id) : author.id == null; + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + + return "Author{" + + "firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", books=" + books + + '}'; + } +} 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..8c8b71dd5e --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -0,0 +1,101 @@ +package guru.springframework.spring5webapp.model; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private String isbn; + private String publisher; + + public Book(String title, String isbn, String publisher, Set authors) { + this.title = title; + this.isbn = isbn; + this.publisher = publisher; + this.authors = authors; + } + + public Book(String title, String isbn, String publisher) { + + this.title = title; + this.isbn = isbn; + this.publisher = publisher; + } + + public Book() { + } + + @ManyToMany + @JoinTable(name= "author_book", joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "author_id")) + private Set authors=new HashSet<>(); + + 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 Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } + + public String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + + return id != null ? id.equals(book.id) : book.id == null; + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Book{" + + "title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + ", publisher='" + publisher + '\'' + + ", authors=" + authors + + '}'; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb2..690b5ca9ba 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.h2.console.enabled = true \ No newline at end of file From 1dff247e19aebe518055193a6ddb5ee293a5bc6a Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jun 2018 17:41:27 +0530 Subject: [PATCH 2/5] adding Bootstrap class to populate data out to H2 DB via Hibernate --- .../spring5webapp/bootstrap/DevBootstrap.java | 43 +++++++++++++++++++ .../spring5webapp/model/Author.java | 8 ++++ .../repositories/AuthorRepository.java | 7 +++ .../repositories/BookRepository.java | 7 +++ 4 files changed, 65 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/AuthorRepository.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/BookRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java new file mode 100644 index 0000000000..6a2f7eca1a --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java @@ -0,0 +1,43 @@ +package guru.springframework.spring5webapp.bootstrap; + +import guru.springframework.spring5webapp.model.Author; +import guru.springframework.spring5webapp.model.Book; +import guru.springframework.spring5webapp.repositories.AuthorRepository; +import guru.springframework.spring5webapp.repositories.BookRepository; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +@Component +public class DevBootstrap implements ApplicationListener{ + + private AuthorRepository authorRepository; + private BookRepository bookRepository; + + public DevBootstrap(AuthorRepository authorRepository, BookRepository bookRepository) { + this.authorRepository = authorRepository; + this.bookRepository = bookRepository; + } + + @Override + public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { + initData(); + } + + private void initData(){ + Author eric=new Author("Eric","Evans"); + Book ericBook=new Book("Domain Driven Design","1234","Harper Collins"); + eric.getBooks().add(ericBook); + ericBook.getAuthors().add(eric); + + authorRepository.save(eric); + bookRepository.save(ericBook); + + Author rod=new Author("Rod","Johnson"); + Book rodBook=new Book("J2ee Development without EJB","3344","Wrox"); + rod.getBooks().add(rodBook); + rodBook.getAuthors().add(rod); + authorRepository.save(rod); + bookRepository.save(rodBook); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/model/Author.java b/src/main/java/guru/springframework/spring5webapp/model/Author.java index 89bc65e9ff..465b0c0584 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Author.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Author.java @@ -15,6 +15,14 @@ public class Author { @ManyToMany(mappedBy="authors") private Set books = new HashSet<>(); + public Author(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + public Author() { + } + public Set getBooks() { return books; } diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/AuthorRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/AuthorRepository.java new file mode 100644 index 0000000000..f8c1315fef --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/AuthorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +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/repositories/BookRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/BookRepository.java new file mode 100644 index 0000000000..c65fe93a52 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/BookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.model.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} From 3526efb79afa8363e1481121400481d625addb90 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jun 2018 19:18:34 +0530 Subject: [PATCH 3/5] adding Bootstrap class to populate data out to H2 DB via Hibernate --- .../spring5webapp/bootstrap/DevBootstrap.java | 18 ++++- .../spring5webapp/model/Book.java | 13 ++-- .../spring5webapp/model/Publisher.java | 68 +++++++++++++++++++ .../repositories/PublisherRepository.java | 7 ++ 4 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/model/Publisher.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/PublisherRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java index 6a2f7eca1a..c29ddfd133 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.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.repositories.AuthorRepository; import guru.springframework.spring5webapp.repositories.BookRepository; +import guru.springframework.spring5webapp.repositories.PublisherRepository; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; @@ -13,30 +15,40 @@ public class DevBootstrap implements ApplicationListener{ private AuthorRepository authorRepository; private BookRepository bookRepository; + private PublisherRepository publisherRepository; - public DevBootstrap(AuthorRepository authorRepository, BookRepository bookRepository) { + public DevBootstrap(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) { this.authorRepository = authorRepository; this.bookRepository = bookRepository; + this.publisherRepository = publisherRepository; } + @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { initData(); } private void initData(){ + Publisher ericBookPublisher=new Publisher("Pearson Education","California,USA"); + publisherRepository.save(ericBookPublisher); + Author eric=new Author("Eric","Evans"); - Book ericBook=new Book("Domain Driven Design","1234","Harper Collins"); + Book ericBook=new Book("Domain Driven Design","1234",ericBookPublisher); eric.getBooks().add(ericBook); ericBook.getAuthors().add(eric); authorRepository.save(eric); bookRepository.save(ericBook); + Publisher rodBookPublisher=new Publisher("Macgraw Hill","Seattle,USA"); + publisherRepository.save(rodBookPublisher); + + Book rodBook=new Book("Domain Driven Design","1234",rodBookPublisher); Author rod=new Author("Rod","Johnson"); - Book rodBook=new Book("J2ee Development without EJB","3344","Wrox"); rod.getBooks().add(rodBook); rodBook.getAuthors().add(rod); + authorRepository.save(rod); bookRepository.save(rodBook); } diff --git a/src/main/java/guru/springframework/spring5webapp/model/Book.java b/src/main/java/guru/springframework/spring5webapp/model/Book.java index 8c8b71dd5e..ffe14d7247 100644 --- a/src/main/java/guru/springframework/spring5webapp/model/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/model/Book.java @@ -11,16 +11,19 @@ public class Book { private Long id; private String title; private String isbn; - private String publisher; - public Book(String title, String isbn, String publisher, Set authors) { + // @OneToOne(fetch = FetchType.LAZY,mappedBy="book") + @OneToOne + private Publisher publisher; + + public Book(String title, String isbn, Publisher publisher, Set authors) { this.title = title; this.isbn = isbn; this.publisher = publisher; this.authors = authors; } - public Book(String title, String isbn, String publisher) { + public Book(String title, String isbn, Publisher publisher) { this.title = title; this.isbn = isbn; @@ -67,11 +70,11 @@ public void setIsbn(String isbn) { this.isbn = isbn; } - public String getPublisher() { + public Publisher getPublisher() { return publisher; } - public void setPublisher(String publisher) { + public void setPublisher(Publisher publisher) { this.publisher = publisher; } 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..f9003a28cb --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/model/Publisher.java @@ -0,0 +1,68 @@ +package guru.springframework.spring5webapp.model; + + import javax.persistence.*; + +@Entity +public class Publisher { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String name; + private String address; + + public Publisher(String name, String address) { + this.name = name; + this.address = address; + } + + public Publisher() { + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Publisher publisher = (Publisher) o; + + return id != null ? id.equals(publisher.id) : publisher.id == null; + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Publisher{" + + "name='" + name + '\'' + + ", address='" + address + '\'' + + '}'; + } +} + diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/PublisherRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/PublisherRepository.java new file mode 100644 index 0000000000..bcae08ecfb --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/PublisherRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.model.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository{ +} From e86e8a10c22c91c3258715a6f5b8b956be04bc60 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Mon, 4 Jun 2018 19:41:35 +0530 Subject: [PATCH 4/5] Adding Publisher --- .../springframework/spring5webapp/bootstrap/DevBootstrap.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java index c29ddfd133..3267121a11 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java @@ -18,6 +18,7 @@ public class DevBootstrap implements ApplicationListener{ private PublisherRepository publisherRepository; public DevBootstrap(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) { + this.authorRepository = authorRepository; this.bookRepository = bookRepository; this.publisherRepository = publisherRepository; From 6b3c2717910acd55cb87658c06dde679deb417e1 Mon Sep 17 00:00:00 2001 From: Pawan Kumar Date: Tue, 5 Jun 2018 18:46:39 +0530 Subject: [PATCH 5/5] Adding view --- .../spring5webapp/bootstrap/DevBootstrap.java | 2 +- .../controllers/AuthorController.java | 24 ++++++++++++++ .../controllers/BookController.java | 22 +++++++++++++ src/main/resources/templates/authors.html | 24 ++++++++++++++ src/main/resources/templates/books.html | 31 +++++++++++++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/controllers/AuthorController.java create mode 100644 src/main/java/guru/springframework/spring5webapp/controllers/BookController.java create mode 100644 src/main/resources/templates/authors.html create mode 100644 src/main/resources/templates/books.html diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java index 3267121a11..300a09a24c 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/DevBootstrap.java @@ -45,7 +45,7 @@ private void initData(){ Publisher rodBookPublisher=new Publisher("Macgraw Hill","Seattle,USA"); publisherRepository.save(rodBookPublisher); - Book rodBook=new Book("Domain Driven Design","1234",rodBookPublisher); + Book rodBook=new Book("J2E Development Without EJB","1234",rodBookPublisher); Author rod=new Author("Rod","Johnson"); rod.getBooks().add(rodBook); rodBook.getAuthors().add(rod); diff --git a/src/main/java/guru/springframework/spring5webapp/controllers/AuthorController.java b/src/main/java/guru/springframework/spring5webapp/controllers/AuthorController.java new file mode 100644 index 0000000000..1323426ca7 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controllers/AuthorController.java @@ -0,0 +1,24 @@ +package guru.springframework.spring5webapp.controllers; + +import guru.springframework.spring5webapp.repositories.AuthorRepository; +import guru.springframework.spring5webapp.repositories.BookRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class AuthorController { + + private AuthorRepository authorRepository; + + public AuthorController(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + + @RequestMapping("/authors") + public String getBooks(Model model){ + model.addAttribute("authors",authorRepository.findAll()); + return "authors"; + } +} + diff --git a/src/main/java/guru/springframework/spring5webapp/controllers/BookController.java b/src/main/java/guru/springframework/spring5webapp/controllers/BookController.java new file mode 100644 index 0000000000..0b3f957149 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controllers/BookController.java @@ -0,0 +1,22 @@ +package guru.springframework.spring5webapp.controllers; + +import guru.springframework.spring5webapp.repositories.BookRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class BookController { + + private BookRepository bookRepository; + + public BookController(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + @RequestMapping("/books") + public String getBooks(Model model){ + model.addAttribute("books",bookRepository.findAll()); + return "books"; + } +} diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html new file mode 100644 index 0000000000..ba33c0070e --- /dev/null +++ b/src/main/resources/templates/authors.html @@ -0,0 +1,24 @@ + + + + + + Spring Framework Guru + + +

Author list

+ + + + + + + + + + + +
First NameLast Name
123R SSalaria
+ + + diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html new file mode 100644 index 0000000000..4d73823d69 --- /dev/null +++ b/src/main/resources/templates/books.html @@ -0,0 +1,31 @@ + + + + + + Spring Framework Guru + + +

Book list

+ + + + + + + + + + + + + + + + + + +
IDTitlePublisherAuthors
123Spring in ActionWrox
+ + +