From bb70907aeb884a2e7edd3efcc7f8f3e0a4ac88c9 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 20 Jul 2022 14:57:53 -0400 Subject: [PATCH 1/9] Update README.md --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 7c94211cf9..15bf7b8dfd 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Got a question about your Spring Framework 5 course? [Checkout these FAQs!](http ### Recommended Versions | Recommended | Reference | Notes | | ----------- | --------- | ----- | -| Oracle Java 8 JDK | [Download](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) | Java 11 is okay, see notes about Java [on the course wiki](https://github.com/springframeworkguru/spring5webapp/wiki/Java-Version) | +| Oracle Java 11 JDK | [Download]([https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html](https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html)) | Java 8 or Java 17 may also be used. | | IntelliJ 2018 or Higher | [Download](https://www.jetbrains.com/idea/download/) | Ultimate Edition recommended. Students can get a free 120 trial license [here](https://github.com/springframeworkguru/spring5webapp/wiki/Which-IDE-to-Use%3F#how-do-i-get-the-free-120-day-trial-to-intellij-ultimate) | | Maven 3.6.0 or higher | [Download](https://maven.apache.org/download.cgi) | [Installation Instructions](https://maven.apache.org/install.html)| | Gradle 4.8 or higher | [Download](https://gradle.org/install/) | **Note:** Use Version 5 or higher if using Java 11 | @@ -25,7 +25,7 @@ Got a question about your Spring Framework 5 course? [Checkout these FAQs!](http ## All Spring Framework Guru Courses ### Spring Framework 5 -* [Spring Framework 5: Beginner to Guru](https://www.udemy.com/testing-spring-boot-beginner-to-guru/?couponCode=GITHUB_REPO) - Get the most modern and comprehensive course available for the Spring Framework! Join over 8,200 over Guru's in an Slack community exclusive to this course! More than 3,700 students have given this 53 hour course a 5 star review! +* [Spring Framework 5: Beginner to Guru](https://www.udemy.com/testing-spring-boot-beginner-to-guru/?couponCode=GITHUB_REPO) - Get the most modern and comprehensive course available for the Spring Framework! Join over 17,200 over Guru's in an Slack community exclusive to this course! More than 5,700 students have given this 53 hour course a 5 star review! * [Spring Boot Microservices with Spring Cloud Beginner to Guru](https://www.udemy.com/course/spring-boot-microservices-with-spring-cloud-beginner-to-guru/?referralCode=6142D427AE53031FEF38) - Master Microservice Architectures Using Spring Boot 2 and Cloud Based Deployments with Spring Cloud and Docker * [Reactive Programming with Spring Framework 5](https://www.udemy.com/reactive-programming-with-spring-framework-5/?couponCode=GITHUB_REPO_SF5B2G) - Keep your skills razor sharp and take a deep dive into Reactive Programming! * [Testing Spring Boot: Beginner to Guru](https://www.udemy.com/testing-spring-boot-beginner-to-guru/?couponCode=GITHUB_REPO_SF5B2G) - ** Best Selling Course** Become an expert in testing Java and Spring Applications with JUnit 5, Mockito and much more! @@ -41,12 +41,8 @@ Got a question about your Spring Framework 5 course? [Checkout these FAQs!](http * [Ready for Production with Spring Boot Actuator](https://www.udemy.com/ready-for-production-with-spring-boot-actuator/?couponCode=GITHUB_REPO_SF5B2G) - Learn how to leverage Spring Boot Actuator to monitor your applications running in production. ### Web Development with Spring Framework -* [Angular 4 Java Developers](https://www.udemy.com/angular-4-java-developers/?couponCode=GITHUB_REPO_SF5B2G) - Learn how to use Angular with Spring Boot. Two flaming hot technologies! This is the only course on Udemy where you can learn how to use JHipster to rapidly build your next application! Also, be sure to checkout the Slack community for this course! * [Mastering Thymeleaf with Spring Boot](https://www.udemy.com/mastering-thymeleaf-with-spring/?couponCode=GITHUB_REPO_SF5B2G) - Once you learn Thymeleaf, you'll never want to go back to using JSPs for web development! -### Spring Framework 4 -* [Spring Core](https://www.udemy.com/spring-core/) - Learn the core of Spring Framework 4! -* [Spring Core Advanced](https://www.udemy.com/spring-core-advanced-beyond-the-basics/?couponCode=GITHUB_REPO_SF5B2G) - Go beyond the basics! Learn about Aspect Oriented Programming, Spring Security, using Spring Events, JMS and more! ## Connect with Spring Framework Guru * Spring Framework Guru [Blog](https://springframework.guru/) From 4c2995a3215dedfc017d90c2f3c836d042c1551f Mon Sep 17 00:00:00 2001 From: saahon Date: Wed, 14 Sep 2022 22:04:29 +0500 Subject: [PATCH 2/9] added: Book entity and repository; --- .../spring5webapp/domain/Book.java | 86 +++++++++++++++++++ .../repositories/BookRepository.java | 7 ++ 2 files changed, 93 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Book.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/BookRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Book.java b/src/main/java/guru/springframework/spring5webapp/domain/Book.java new file mode 100644 index 0000000000..c1cc5cecdd --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Book.java @@ -0,0 +1,86 @@ +package guru.springframework.spring5webapp.domain; + +import javax.persistence.*; +import java.util.HashSet; +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 = new HashSet<>(); + + 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; + } + + public Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + + @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 id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + ", authors=" + authors + + '}'; + } +} 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..570726803e --- /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.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} From 9d0339946c6383e08fd98cece9515bbbb5d81460 Mon Sep 17 00:00:00 2001 From: saahon Date: Wed, 14 Sep 2022 22:04:48 +0500 Subject: [PATCH 3/9] added: Author entity and repository; --- .../spring5webapp/domain/Author.java | 85 +++++++++++++++++++ .../repositories/AuthorRepository.java | 7 ++ 2 files changed, 92 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Author.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/AuthorRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Author.java b/src/main/java/guru/springframework/spring5webapp/domain/Author.java new file mode 100644 index 0000000000..28dee0cbd8 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Author.java @@ -0,0 +1,85 @@ +package guru.springframework.spring5webapp.domain; + +import javax.persistence.*; +import java.util.HashSet; +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 = new HashSet<>(); + + public Author() { + } + + public Author(Long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + 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 id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", books=" + 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..a5aa1f8726 --- /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.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository { +} From b0da13a7343df795673f1ff48138ace98e47a6e5 Mon Sep 17 00:00:00 2001 From: saahon Date: Wed, 14 Sep 2022 22:05:06 +0500 Subject: [PATCH 4/9] added: Address entity and repository; --- .../spring5webapp/domain/Address.java | 100 ++++++++++++++++++ .../repositories/AddressRepository.java | 7 ++ 2 files changed, 107 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Address.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Address.java b/src/main/java/guru/springframework/spring5webapp/domain/Address.java new file mode 100644 index 0000000000..2232ddb6b8 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Address.java @@ -0,0 +1,100 @@ +package guru.springframework.spring5webapp.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Objects; + +@Entity +public class Address { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String address; + + private String city; + + private String state; + + private String zip; + + public Address() { + } + + public Address(Long id, String address, String city, String state, String zip) { + this.id = id; + this.address = address; + this.city = city; + this.state = state; + this.zip = zip; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + 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 String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Address address = (Address) o; + + return Objects.equals(id, address.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Address{" + + "id=" + id + + ", address='" + address + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + + '}'; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java new file mode 100644 index 0000000000..d3e73993cf --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repositories; + +import guru.springframework.spring5webapp.domain.Address; +import org.springframework.data.repository.CrudRepository; + +public interface AddressRepository extends CrudRepository { +} From a0e5118d8df2d0045e3ccfc14446926f36c7ca60 Mon Sep 17 00:00:00 2001 From: saahon Date: Wed, 14 Sep 2022 22:05:21 +0500 Subject: [PATCH 5/9] added: Publisher entity and repository; --- .../spring5webapp/domain/Publisher.java | 73 +++++++++++++++++++ .../repositories/PublisherRepository.java | 7 ++ 2 files changed, 80 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Publisher.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/PublisherRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java new file mode 100644 index 0000000000..3d40f1555c --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java @@ -0,0 +1,73 @@ +package guru.springframework.spring5webapp.domain; + +import javax.persistence.*; +import java.util.Objects; + +@Entity +public class Publisher { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + @ManyToOne + private Address address; + + public Publisher() { + } + + public Publisher(Long id, String name, Address address) { + this.id = id; + this.name = name; + this.address = address; + } + + 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 Address getAddress() { + return address; + } + + public void setAddress(Address 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 Objects.equals(id, publisher.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + + @Override + public String toString() { + return "Publisher{" + + "id=" + id + + ", 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..8445629922 --- /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.domain.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository { +} From 5a94d82b094531afa9fb5ecd08a26c85eb9e5fb5 Mon Sep 17 00:00:00 2001 From: saahon Date: Wed, 14 Sep 2022 22:06:49 +0500 Subject: [PATCH 6/9] added: BootStrapData and created initial data for Book, Author, Address and Publisher entities; --- .../bootstrap/BootStrapData.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) 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..b617498da9 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -0,0 +1,87 @@ +package guru.springframework.spring5webapp.bootstrap; + +import guru.springframework.spring5webapp.domain.Address; +import guru.springframework.spring5webapp.domain.Author; +import guru.springframework.spring5webapp.domain.Book; +import guru.springframework.spring5webapp.domain.Publisher; +import guru.springframework.spring5webapp.repositories.AddressRepository; +import guru.springframework.spring5webapp.repositories.AuthorRepository; +import guru.springframework.spring5webapp.repositories.BookRepository; +import guru.springframework.spring5webapp.repositories.PublisherRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootStrapData implements CommandLineRunner { + + public static final String PUBLISHER_ADDRESS = "Sayram 5"; + public static final String PUBLISHER_CITY = "Tashkent"; + public static final String PUBLISHER_STATE = "Tashkent"; + public static final String PUBLISHER_ZIP_CODE = "100000"; + public static final String BOOK_NAME = "Java book"; + public static final String ISBN = "12345"; + private final BookRepository bookRepository; + private final AuthorRepository authorRepository; + private final AddressRepository addressRepository; + private final PublisherRepository publisherRepository; + + public BootStrapData(BookRepository bookRepository, AuthorRepository authorRepository, AddressRepository addressRepository, PublisherRepository publisherRepository) { + this.bookRepository = bookRepository; + this.authorRepository = authorRepository; + this.addressRepository = addressRepository; + this.publisherRepository = publisherRepository; + } + + @Override + public void run(String... args) { + Author saahon = createAuthor(); + Book book = createBook(); + + saahon.getBooks().add(book); + book.getAuthors().add(saahon); + authorRepository.save(saahon); + bookRepository.save(book); + + Address address = createAddress(); + addressRepository.save(address); + + Publisher publisher = createPublisher(saahon, address); + publisherRepository.save(publisher); + + System.out.println("Started in Bootstrap"); + System.out.println("saved books: " + bookRepository.count()); + System.out.println("saved authors: " + authorRepository.count()); + System.out.println("saved publishers: " + publisherRepository.count()); + System.out.println("saved addresses: " + addressRepository.count()); + } + + private static Publisher createPublisher(Author saahon, Address address) { + Publisher publisher = new Publisher(); + publisher.setName(saahon.getFirstName()); + publisher.setAddress(address); + return publisher; + } + + private static Address createAddress() { + Address address = new Address(); + address.setAddress(PUBLISHER_ADDRESS); + address.setCity(PUBLISHER_CITY); + address.setState(PUBLISHER_STATE); + address.setZip(PUBLISHER_ZIP_CODE); + return address; + } + + private static Book createBook() { + Book book = new Book(); + book.setTitle(BOOK_NAME); + book.setIsbn(ISBN); + return book; + } + + private static Author createAuthor() { + Author saahon = new Author(); + saahon.setFirstName("Saidakramov"); + saahon.setLastName("Avaz"); + return saahon; + } +} From cbdb91d688f8128a4fbcda6fd812999419e5fc3b Mon Sep 17 00:00:00 2001 From: saahon Date: Fri, 16 Sep 2022 19:57:51 +0500 Subject: [PATCH 7/9] fixed: addresses moved from Address entity to Publisher; --- .../bootstrap/BootStrapData.java | 32 ++---- .../spring5webapp/domain/Address.java | 100 ------------------ .../spring5webapp/domain/Book.java | 3 + .../spring5webapp/domain/Publisher.java | 65 ++++++++++-- .../repositories/AddressRepository.java | 7 -- 5 files changed, 67 insertions(+), 140 deletions(-) delete mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Address.java delete mode 100644 src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java index b617498da9..f1742a9910 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -1,10 +1,8 @@ package guru.springframework.spring5webapp.bootstrap; -import guru.springframework.spring5webapp.domain.Address; import guru.springframework.spring5webapp.domain.Author; import guru.springframework.spring5webapp.domain.Book; import guru.springframework.spring5webapp.domain.Publisher; -import guru.springframework.spring5webapp.repositories.AddressRepository; import guru.springframework.spring5webapp.repositories.AuthorRepository; import guru.springframework.spring5webapp.repositories.BookRepository; import guru.springframework.spring5webapp.repositories.PublisherRepository; @@ -22,16 +20,13 @@ public class BootStrapData implements CommandLineRunner { public static final String ISBN = "12345"; private final BookRepository bookRepository; private final AuthorRepository authorRepository; - private final AddressRepository addressRepository; private final PublisherRepository publisherRepository; - public BootStrapData(BookRepository bookRepository, AuthorRepository authorRepository, AddressRepository addressRepository, PublisherRepository publisherRepository) { + public BootStrapData(BookRepository bookRepository, AuthorRepository authorRepository, PublisherRepository publisherRepository) { this.bookRepository = bookRepository; this.authorRepository = authorRepository; - this.addressRepository = addressRepository; this.publisherRepository = publisherRepository; } - @Override public void run(String... args) { Author saahon = createAuthor(); @@ -42,35 +37,24 @@ public void run(String... args) { authorRepository.save(saahon); bookRepository.save(book); - Address address = createAddress(); - addressRepository.save(address); - - Publisher publisher = createPublisher(saahon, address); + Publisher publisher = createPublisher(saahon); publisherRepository.save(publisher); System.out.println("Started in Bootstrap"); System.out.println("saved books: " + bookRepository.count()); System.out.println("saved authors: " + authorRepository.count()); System.out.println("saved publishers: " + publisherRepository.count()); - System.out.println("saved addresses: " + addressRepository.count()); } - private static Publisher createPublisher(Author saahon, Address address) { + private static Publisher createPublisher(Author saahon) { Publisher publisher = new Publisher(); - publisher.setName(saahon.getFirstName()); - publisher.setAddress(address); + publisher.setAddressLine1(saahon.getFirstName()); + publisher.setAddressLine1(PUBLISHER_ADDRESS); + publisher.setCity(PUBLISHER_CITY); + publisher.setState(PUBLISHER_STATE); + publisher.setZip(PUBLISHER_ZIP_CODE); return publisher; } - - private static Address createAddress() { - Address address = new Address(); - address.setAddress(PUBLISHER_ADDRESS); - address.setCity(PUBLISHER_CITY); - address.setState(PUBLISHER_STATE); - address.setZip(PUBLISHER_ZIP_CODE); - return address; - } - private static Book createBook() { Book book = new Book(); book.setTitle(BOOK_NAME); diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Address.java b/src/main/java/guru/springframework/spring5webapp/domain/Address.java deleted file mode 100644 index 2232ddb6b8..0000000000 --- a/src/main/java/guru/springframework/spring5webapp/domain/Address.java +++ /dev/null @@ -1,100 +0,0 @@ -package guru.springframework.spring5webapp.domain; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import java.util.Objects; - -@Entity -public class Address { - - @Id - @GeneratedValue(strategy = GenerationType.AUTO) - private Long id; - - private String address; - - private String city; - - private String state; - - private String zip; - - public Address() { - } - - public Address(Long id, String address, String city, String state, String zip) { - this.id = id; - this.address = address; - this.city = city; - this.state = state; - this.zip = zip; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - 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 String getZip() { - return zip; - } - - public void setZip(String zip) { - this.zip = zip; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Address address = (Address) o; - - return Objects.equals(id, address.id); - } - - @Override - public int hashCode() { - return id != null ? id.hashCode() : 0; - } - - @Override - public String toString() { - return "Address{" + - "id=" + id + - ", address='" + address + '\'' + - ", city='" + city + '\'' + - ", state='" + state + '\'' + - ", zip='" + zip + '\'' + - '}'; - } -} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Book.java b/src/main/java/guru/springframework/spring5webapp/domain/Book.java index c1cc5cecdd..afa1a3c587 100644 --- a/src/main/java/guru/springframework/spring5webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/domain/Book.java @@ -18,6 +18,9 @@ public class Book { @JoinTable(name = "author_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "author_id")) private Set authors = new HashSet<>(); + @ManyToOne + private Publisher publisher; + public Book() { } diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java index 3d40f1555c..1ff600407f 100644 --- a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java +++ b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java @@ -1,7 +1,9 @@ package guru.springframework.spring5webapp.domain; import javax.persistence.*; +import java.util.HashSet; import java.util.Objects; +import java.util.Set; @Entity public class Publisher { @@ -10,17 +12,27 @@ public class Publisher { private Long id; private String name; + private String addressLine1; + private String city; - @ManyToOne - private Address address; + private String state; + + private String zip; + + @OneToMany + @JoinColumn(name = "publisher_id") + private Set books = new HashSet<>(); public Publisher() { } - public Publisher(Long id, String name, Address address) { + public Publisher(Long id, String name, String addressLine1, String city, String state, String zip) { this.id = id; this.name = name; - this.address = address; + this.addressLine1 = addressLine1; + this.city = city; + this.state = state; + this.zip = zip; } public Long getId() { @@ -39,12 +51,44 @@ public void setName(String name) { this.name = name; } - public Address getAddress() { - return address; + public String getAddressLine1() { + return addressLine1; + } + + public void setAddressLine1(String addressLine1) { + this.addressLine1 = addressLine1; + } + + 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 String getZip() { + return zip; + } + + public void setZip(String zip) { + this.zip = zip; + } + + public Set getBooks() { + return books; } - public void setAddress(Address address) { - this.address = address; + public void setBooks(Set books) { + this.books = books; } @Override @@ -67,7 +111,10 @@ public String toString() { return "Publisher{" + "id=" + id + ", name='" + name + '\'' + - ", address=" + address + + ", addressLine1='" + addressLine1 + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + '}'; } } diff --git a/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java b/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java deleted file mode 100644 index d3e73993cf..0000000000 --- a/src/main/java/guru/springframework/spring5webapp/repositories/AddressRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package guru.springframework.spring5webapp.repositories; - -import guru.springframework.spring5webapp.domain.Address; -import org.springframework.data.repository.CrudRepository; - -public interface AddressRepository extends CrudRepository { -} From 8d1204d001534decad9bcbeee6b880230444998a Mon Sep 17 00:00:00 2001 From: saahon Date: Fri, 16 Sep 2022 20:14:04 +0500 Subject: [PATCH 8/9] fixed: add controller and view for Book entity; --- .../bootstrap/BootStrapData.java | 6 +++-- .../controller/BookController.java | 22 +++++++++++++++++ .../spring5webapp/domain/Book.java | 13 +++++++++- .../spring5webapp/domain/Publisher.java | 4 +++- src/main/resources/application.properties | 1 + src/main/resources/templates/books/list.html | 24 +++++++++++++++++++ 6 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/controller/BookController.java create mode 100644 src/main/resources/templates/books/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 f1742a9910..3ea3629879 100644 --- a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -35,11 +35,13 @@ public void run(String... args) { saahon.getBooks().add(book); book.getAuthors().add(saahon); authorRepository.save(saahon); - bookRepository.save(book); Publisher publisher = createPublisher(saahon); publisherRepository.save(publisher); + book.setPublisher(publisher); + bookRepository.save(book); + System.out.println("Started in Bootstrap"); System.out.println("saved books: " + bookRepository.count()); System.out.println("saved authors: " + authorRepository.count()); @@ -48,7 +50,7 @@ public void run(String... args) { private static Publisher createPublisher(Author saahon) { Publisher publisher = new Publisher(); - publisher.setAddressLine1(saahon.getFirstName()); + publisher.setName(saahon.getFirstName()); publisher.setAddressLine1(PUBLISHER_ADDRESS); publisher.setCity(PUBLISHER_CITY); publisher.setState(PUBLISHER_STATE); 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..249bae5ae0 --- /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.repositories.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 "books/list"; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Book.java b/src/main/java/guru/springframework/spring5webapp/domain/Book.java index afa1a3c587..d90abd0598 100644 --- a/src/main/java/guru/springframework/spring5webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/domain/Book.java @@ -24,10 +24,12 @@ public class Book { public Book() { } - public Book(Long id, String title, String isbn) { + public Book(Long id, String title, String isbn, Set authors, Publisher publisher) { this.id = id; this.title = title; this.isbn = isbn; + this.authors = authors; + this.publisher = publisher; } public Long getId() { @@ -62,6 +64,14 @@ public void setAuthors(Set authors) { this.authors = authors; } + public Publisher getPublisher() { + return publisher; + } + + public void setPublisher(Publisher publisher) { + this.publisher = publisher; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -84,6 +94,7 @@ public String toString() { ", title='" + title + '\'' + ", isbn='" + isbn + '\'' + ", authors=" + authors + + ", publisher=" + publisher + '}'; } } diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java index 1ff600407f..cebedc485e 100644 --- a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java +++ b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java @@ -26,13 +26,14 @@ public class Publisher { public Publisher() { } - public Publisher(Long id, String name, String addressLine1, String city, String state, String zip) { + public Publisher(Long id, String name, String addressLine1, String city, String state, String zip, Set books) { this.id = id; this.name = name; this.addressLine1 = addressLine1; this.city = city; this.state = state; this.zip = zip; + this.books = books; } public Long getId() { @@ -115,6 +116,7 @@ public String toString() { ", city='" + city + '\'' + ", state='" + state + '\'' + ", zip='" + zip + '\'' + + ", books=" + books + '}'; } } 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/books/list.html b/src/main/resources/templates/books/list.html new file mode 100644 index 0000000000..fda40c4b8b --- /dev/null +++ b/src/main/resources/templates/books/list.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Book List

+ + + + + + + + + + + + +
IDTitlePublisher
123 Spring in ActionWrox
+ + + From f7bbfb40668c1b82bbf6282f123abd8cf474635e Mon Sep 17 00:00:00 2001 From: saahon Date: Fri, 16 Sep 2022 20:42:36 +0500 Subject: [PATCH 9/9] added: AuthorController and view; fixed: Book.java toString() method; --- .../controller/AuthorController.java | 23 +++++++++++ .../spring5webapp/domain/Book.java | 2 - .../resources/templates/authors/list.html | 38 +++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java create mode 100644 src/main/resources/templates/authors/list.html diff --git a/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java b/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java new file mode 100644 index 0000000000..31aa34cc39 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java @@ -0,0 +1,23 @@ +package guru.springframework.spring5webapp.controller; + +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 final AuthorRepository authorRepository; + + public AuthorController(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + + @RequestMapping("/authors") + public String getBooks(Model model) { + model.addAttribute("authors", authorRepository.findAll()); + return "authors/list"; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Book.java b/src/main/java/guru/springframework/spring5webapp/domain/Book.java index d90abd0598..6b56d99d2c 100644 --- a/src/main/java/guru/springframework/spring5webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring5webapp/domain/Book.java @@ -93,8 +93,6 @@ public String toString() { "id=" + id + ", title='" + title + '\'' + ", isbn='" + isbn + '\'' + - ", authors=" + authors + - ", publisher=" + publisher + '}'; } } diff --git a/src/main/resources/templates/authors/list.html b/src/main/resources/templates/authors/list.html new file mode 100644 index 0000000000..e05c50e05f --- /dev/null +++ b/src/main/resources/templates/authors/list.html @@ -0,0 +1,38 @@ + + + + + Spring Framework Guru + + +

Author List

+ + + + + + + + + + + + +
IDFirstNameLastName
123 Spring in ActionWrox
+ +

Authors Book List

+ + + + + + + + + + + +
authorNameauthorLastName
idtitleisbn
+ + +