From 15c2a5a5e3bc12b57971f3615e2268df031ba269 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 20 Jul 2022 15:57:56 -0400 Subject: [PATCH 1/5] adding example of JPA Entities --- .../spring6webapp/domain/Author.java | 43 +++++++++++++++++++ .../spring6webapp/domain/Book.java | 43 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/Author.java create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/Book.java diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/src/main/java/guru/springframework/spring6webapp/domain/Author.java new file mode 100644 index 000000000..b3abed061 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -0,0 +1,43 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +/** + * Created by jt, Spring Framework Guru. + */ +@Entity +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String firstName; + private String 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; + } +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/src/main/java/guru/springframework/spring6webapp/domain/Book.java new file mode 100644 index 000000000..7ff68c4cb --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -0,0 +1,43 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +/** + * Created by jt, Spring Framework Guru. + */ +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String title; + private String 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; + } +} From 9527a327095f162a0249ef88abba5d782ea22095 Mon Sep 17 00:00:00 2001 From: Manh Nam Date: Wed, 4 Oct 2023 10:56:20 +0700 Subject: [PATCH 2/5] jpa - entity --- spring-6-webapp/README.md | 2 + .../spring6webapp/domain/Author.java | 49 +++++++++++++++++ .../spring6webapp/domain/Book.java | 54 +++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 spring-6-webapp/README.md create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java diff --git a/spring-6-webapp/README.md b/spring-6-webapp/README.md new file mode 100644 index 000000000..75752f436 --- /dev/null +++ b/spring-6-webapp/README.md @@ -0,0 +1,2 @@ +# spring-6-webapp +Spring 6 Web App \ No newline at end of file diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java new file mode 100644 index 000000000..1a2922d53 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -0,0 +1,49 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.Set; + +@Entity +public class Author { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String firstName; + private String lastName; + + private Set books; + + @ManyToMany(mappedBy = "authors") + 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; + } +} diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java new file mode 100644 index 000000000..98c4e17d9 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -0,0 +1,54 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.Set; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + private String author; + + @ManyToMany + @JoinTable( + name = "author_book", + joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "author_id")) + private Set authors; + + public Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + + 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 getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} From 9218ba0995c39bc9f01ca1f6eccc97e93b093a0b Mon Sep 17 00:00:00 2001 From: Manh Nam Date: Wed, 4 Oct 2023 11:12:14 +0700 Subject: [PATCH 3/5] Add repository --- .../spring6webapp/domain/Author.java | 24 ++++++++++++ .../spring6webapp/domain/Book.java | 37 +++++++++++++++++++ .../repository/AuthorRepository.java | 8 ++++ .../repository/BookRepository.java | 8 ++++ 4 files changed, 77 insertions(+) create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/AuthorRepository.java create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/BookRepository.java diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java index 1a2922d53..52ac20eec 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -46,4 +46,28 @@ public String getLastName() { public void setLastName(String lastName) { this.lastName = lastName; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Author author)) return false; + + return getId() != null ? getId().equals(author.getId()) : author.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } + + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", books=" + books + + '}'; + } } diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java index 98c4e17d9..fcdcdb2bc 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -51,4 +51,41 @@ public String getAuthor() { public void setAuthor(String author) { this.author = author; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Book book)) return false; + + return getId() != null ? getId().equals(book.getId()) : book.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", author='" + author + '\'' + + ", authors=" + authors + + '}'; + } } + + + + + + + + + + + + + + diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/AuthorRepository.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/AuthorRepository.java new file mode 100644 index 000000000..b2686cdf8 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/AuthorRepository.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6webapp.repository; + +import guru.springframework.spring6webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository { + +} diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/BookRepository.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/BookRepository.java new file mode 100644 index 000000000..5b0198901 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/BookRepository.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6webapp.repository; + +import guru.springframework.spring6webapp.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { + +} From 698e5c5049c9c7ceb89c4a08aec3e773a9f0d412 Mon Sep 17 00:00:00 2001 From: Manh Nam Date: Wed, 4 Oct 2023 11:39:45 +0700 Subject: [PATCH 4/5] Add Publisher --- .../bootstrap/BootstrapData.java | 66 ++++++++++++++ .../spring6webapp/domain/Author.java | 5 +- .../spring6webapp/domain/Book.java | 15 +-- .../spring6webapp/domain/Publisher.java | 91 +++++++++++++++++++ .../repository/PublisherRepository.java | 7 ++ 5 files changed, 175 insertions(+), 9 deletions(-) create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java create mode 100644 spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/PublisherRepository.java diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java new file mode 100644 index 000000000..9553711c1 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java @@ -0,0 +1,66 @@ +package guru.springframework.spring6webapp.bootstrap; + +import guru.springframework.spring6webapp.domain.Author; +import guru.springframework.spring6webapp.domain.Book; +import guru.springframework.spring6webapp.domain.Publisher; +import guru.springframework.spring6webapp.repository.AuthorRepository; +import guru.springframework.spring6webapp.repository.BookRepository; +import guru.springframework.spring6webapp.repository.PublisherRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootstrapData implements CommandLineRunner { + private final PublisherRepository publisherRepository; + private final AuthorRepository authorRepository; + private final BookRepository bookRepository; + + 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 { + Author eric = new Author(); + eric.setFirstName("Eric"); + eric.setFirstName("Evans"); + + Book ddd = new Book(); + ddd.setTitle("Domain Driven Design"); + ddd.setIsbn("123456"); + + Author ericSaved = authorRepository.save(eric); + Book dddSaved = bookRepository.save(ddd); + Author rod = new Author(); + rod.setFirstName("Rod"); + rod.setFirstName("Johnson"); + + Book noEJB = new Book(); + noEJB.setTitle("J2EE Development without EJB"); + noEJB.setIsbn("54757587"); + + Author rodSaved = authorRepository.save(rod); + Book noEJBSaved = bookRepository.save(noEJB); + + ericSaved.getBooks().add(dddSaved); + rodSaved.getBooks().add(noEJBSaved); + + authorRepository.save(ericSaved); + authorRepository.save(rodSaved); + + Publisher publisher = new Publisher(); + publisher.setAddress("The city Of Books"); + publisher.setPublisherName("Amazon Books"); + publisher.setCity("New Youk"); + publisherRepository.save(publisher); + System.out.println("Publisher count: "); + System.out.println(publisherRepository.count()); + + System.out.println("In Bootstrap"); + System.out.println("Author count: " + authorRepository.count()); + System.out.println("Book count: " + bookRepository.count()); + + } +} diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java index 52ac20eec..3230a7f32 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.HashSet; import java.util.Set; @Entity @@ -12,9 +13,9 @@ public class Author { private String firstName; private String lastName; - private Set books; - @ManyToMany(mappedBy = "authors") + private Set books = new HashSet<>(); + public Set getBooks() { return books; } diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java index fcdcdb2bc..85134a6b8 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.HashSet; import java.util.Set; @Entity @@ -11,14 +12,14 @@ public class Book { private Long id; private String title; - private String author; + private String isbn; @ManyToMany @JoinTable( name = "author_book", joinColumns = @JoinColumn(name = "book_id"), inverseJoinColumns = @JoinColumn(name = "author_id")) - private Set authors; + private Set authors = new HashSet<>(); public Set getAuthors() { return authors; @@ -44,12 +45,12 @@ public void setTitle(String title) { this.title = title; } - public String getAuthor() { - return author; + public String getIsbn() { + return isbn; } - public void setAuthor(String author) { - this.author = author; + public void setIsbn(String author) { + this.isbn = author; } @Override @@ -70,7 +71,7 @@ public String toString() { return "Book{" + "id=" + id + ", title='" + title + '\'' + - ", author='" + author + '\'' + + ", author='" + isbn + '\'' + ", authors=" + authors + '}'; } diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java new file mode 100644 index 000000000..a60d939d2 --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java @@ -0,0 +1,91 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity +public class Publisher { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + private String publisherName; + private String address; + private String city; + private String state; + private String zip; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getPublisherName() { + return publisherName; + } + + public void setPublisherName(String publisherName) { + this.publisherName = publisherName; + } + + 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 instanceof Publisher publisher)) return false; + + return getId() != null ? getId().equals(publisher.getId()) : publisher.getId() == null; + } + + @Override + public int hashCode() { + return getId() != null ? getId().hashCode() : 0; + } + + @Override + public String toString() { + return "Publisher{" + + "id=" + id + + ", publisherName='" + publisherName + '\'' + + ", address='" + address + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + + '}'; + } +} diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/PublisherRepository.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/PublisherRepository.java new file mode 100644 index 000000000..ac5c7932a --- /dev/null +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/repository/PublisherRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repository; + +import guru.springframework.spring6webapp.domain.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository { +} From 74a1a362cd2674290ca9e655df99df23aefc31f3 Mon Sep 17 00:00:00 2001 From: Manh Nam Date: Wed, 4 Oct 2023 12:17:23 +0700 Subject: [PATCH 5/5] Enable H2 console --- .../bootstrap/BootstrapData.java | 16 ++++++++-- .../spring6webapp/domain/Book.java | 11 +++++++ .../spring6webapp/domain/Publisher.java | 30 ++++++++++++------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java index 9553711c1..e8ee6d69c 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java @@ -47,17 +47,27 @@ public void run(String... args) throws Exception { ericSaved.getBooks().add(dddSaved); rodSaved.getBooks().add(noEJBSaved); - authorRepository.save(ericSaved); - authorRepository.save(rodSaved); Publisher publisher = new Publisher(); publisher.setAddress("The city Of Books"); publisher.setPublisherName("Amazon Books"); publisher.setCity("New Youk"); - publisherRepository.save(publisher); + Publisher savedPublisher = publisherRepository.save(publisher); + + dddSaved.setPublisher(savedPublisher); + noEJBSaved.setPublisher(publisher); + System.out.println("Publisher count: "); System.out.println(publisherRepository.count()); + + authorRepository.save(ericSaved); + authorRepository.save(rodSaved); + bookRepository.save(dddSaved); + bookRepository.save(noEJBSaved); + + + System.out.println("In Bootstrap"); System.out.println("Author count: " + authorRepository.count()); System.out.println("Book count: " + bookRepository.count()); diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java index 85134a6b8..6230606c2 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -14,6 +14,17 @@ public class Book { private String title; private String isbn; + @ManyToOne + private Publisher publisher; + + public Publisher getPublisher() { + return publisher; + } + + public void setPublisher(Publisher publisher) { + this.publisher = publisher; + } + @ManyToMany @JoinTable( name = "author_book", diff --git a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java index a60d939d2..5528300cc 100644 --- a/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java +++ b/spring-6-webapp/src/main/java/guru/springframework/spring6webapp/domain/Publisher.java @@ -1,9 +1,8 @@ package guru.springframework.spring6webapp.domain; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; +import jakarta.persistence.*; + +import java.util.Set; @Entity public class Publisher { @@ -14,7 +13,18 @@ public class Publisher { private String address; private String city; private String state; - private String zip; + private String zipCode; + + @OneToMany(mappedBy = "publisher") + private Set books; + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + this.books = books; + } public Long getId() { return id; @@ -56,12 +66,12 @@ public void setState(String state) { this.state = state; } - public String getZip() { - return zip; + public String getZipCode() { + return zipCode; } - public void setZip(String zip) { - this.zip = zip; + public void setZipCode(String zip) { + this.zipCode = zip; } @Override @@ -85,7 +95,7 @@ public String toString() { ", address='" + address + '\'' + ", city='" + city + '\'' + ", state='" + state + '\'' + - ", zip='" + zip + '\'' + + ", zip='" + zipCode + '\'' + '}'; } }