From f0c4efac7599ab13e7670d9123dbf26673aa9deb Mon Sep 17 00:00:00 2001 From: beheidary Date: Wed, 3 Jan 2024 00:43:56 +0330 Subject: [PATCH 1/5] adding example of JPA Entities --- .../spring6webapp/domain/Author.java | 40 +++++++++++++++++++ .../spring6webapp/domain/Book.java | 40 +++++++++++++++++++ 2 files changed, 80 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..9ddeb95f0 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -0,0 +1,40 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@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..6b40d43b1 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -0,0 +1,40 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@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 9ee33bb17d82d504ede01b4e7165a04229656a60 Mon Sep 17 00:00:00 2001 From: beheidary Date: Wed, 3 Jan 2024 02:23:44 +0330 Subject: [PATCH 2/5] adding relationship example --- .../spring6webapp/domain/Author.java | 18 +++++++++++++---- .../spring6webapp/domain/Book.java | 20 +++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/src/main/java/guru/springframework/spring6webapp/domain/Author.java index 9ddeb95f0..fcf988fde 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Author.java +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.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 Author { @@ -14,6 +13,17 @@ public class Author { private String firstName; private String lastName; + @ManyToMany(mappedBy = "authors") + private Set books; + + public Set getBooks() { + return books; + } + + public void setBooks(Set books) { + this.books = books; + } + public long getId() { return id; } diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/src/main/java/guru/springframework/spring6webapp/domain/Book.java index 6b40d43b1..4615700df 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.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 Book { @@ -14,6 +13,19 @@ public class Book { 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 Set getAuthors() { + return authors; + } + + public void setAuthors(Set authors) { + this.authors = authors; + } + public Long getId() { return id; } From 5324b3749332d61346fdd87703121e4eabc24489 Mon Sep 17 00:00:00 2001 From: beheidary Date: Wed, 10 Jan 2024 12:00:19 +0330 Subject: [PATCH 3/5] hibernate equity for terminate same entities --- .../spring6webapp/domain/Author.java | 32 +++++++++++++++++++ .../spring6webapp/domain/Book.java | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/src/main/java/guru/springframework/spring6webapp/domain/Author.java index fcf988fde..b8f0786b8 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Author.java +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -47,4 +47,36 @@ public String getLastName() { public void setLastName(String lastName) { this.lastName = lastName; } + + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", 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 id == author.id; + } + + @Override + public int hashCode() { + return (int) (id ^ (id >>> 32)); + } } + + + + + + diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/src/main/java/guru/springframework/spring6webapp/domain/Book.java index 4615700df..95fbf99f1 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.Objects; import java.util.Set; @Entity @@ -49,4 +50,35 @@ public String getIsbn() { public void setIsbn(String isbn) { this.isbn = isbn; } + + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + ", 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; + } } + + + + + From a130e9337dabcd42b00f8d54a2a29d4205c134a7 Mon Sep 17 00:00:00 2001 From: beheidary Date: Wed, 10 Jan 2024 15:24:38 +0330 Subject: [PATCH 4/5] Add crud Repository --- .../domain/repositories/AuthorRepositories.java | 7 +++++++ .../spring6webapp/domain/repositories/BookRepository.java | 7 +++++++ 2 files changed, 14 insertions(+) create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java create mode 100644 src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java diff --git a/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java b/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java new file mode 100644 index 000000000..2bc6ef8a7 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.domain.repositories; + +import guru.springframework.spring6webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepositories extends CrudRepository{ +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java b/src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java new file mode 100644 index 000000000..8cb8f1ae8 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.domain.repositories; + +import guru.springframework.spring6webapp.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} From a986283275f10664b1bb44a08f66f016e7c4cca6 Mon Sep 17 00:00:00 2001 From: beheidary Date: Sun, 21 Jan 2024 00:52:01 +0330 Subject: [PATCH 5/5] Bootstrap Data Persist --- .../bootstrap/BootstrapData.java | 68 +++++++++++++++++++ .../spring6webapp/domain/Author.java | 3 +- .../spring6webapp/domain/Book.java | 3 +- .../repositories/AuthorRepositories.java | 7 -- .../repositories/AuthorRepository.java | 7 ++ .../repositories/BookRepository.java | 2 +- 6 files changed, 80 insertions(+), 10 deletions(-) create mode 100644 src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java delete mode 100644 src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java create mode 100644 src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java rename src/main/java/guru/springframework/spring6webapp/{domain => }/repositories/BookRepository.java (74%) diff --git a/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java b/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java new file mode 100644 index 000000000..a2d184444 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java @@ -0,0 +1,68 @@ +package guru.springframework.spring6webapp.bootstrap; + +import guru.springframework.spring6webapp.domain.Author; +import guru.springframework.spring6webapp.domain.Book; +import guru.springframework.spring6webapp.repositories.AuthorRepository; +import guru.springframework.spring6webapp.repositories.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.setFirstName("Eric"); + eric.setLastName("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.setLastName("Johnson"); + + Book noEJB = new Book(); + noEJB.setTitle("J2EE Development without EJB"); + noEJB.setIsbn("54757585"); + + Author rodSaved = authorRepository.save(rod); + Book noEJBSaved = bookRepository.save(noEJB); + + ericSaved.getBooks().add(dddSaved); + rodSaved.getBooks().add(noEJBSaved); + + authorRepository.save(ericSaved); + authorRepository.save(rodSaved); + + System.out.println("In Bootstrap"); + System.out.println("Author Count: " + authorRepository.count()); + System.out.println("Book Count:" + bookRepository.count()); + + + + } +} + + + + + + + + diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Author.java b/src/main/java/guru/springframework/spring6webapp/domain/Author.java index b8f0786b8..2878f9f80 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Author.java +++ b/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 @@ -14,7 +15,7 @@ public class Author { private String lastName; @ManyToMany(mappedBy = "authors") - private Set books; + private Set books = new HashSet<>(); public Set getBooks() { return books; diff --git a/src/main/java/guru/springframework/spring6webapp/domain/Book.java b/src/main/java/guru/springframework/spring6webapp/domain/Book.java index 95fbf99f1..4e220d10f 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/Book.java +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; +import java.util.HashSet; import java.util.Objects; import java.util.Set; @@ -17,7 +18,7 @@ public class Book { @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; diff --git a/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java b/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java deleted file mode 100644 index 2bc6ef8a7..000000000 --- a/src/main/java/guru/springframework/spring6webapp/domain/repositories/AuthorRepositories.java +++ /dev/null @@ -1,7 +0,0 @@ -package guru.springframework.spring6webapp.domain.repositories; - -import guru.springframework.spring6webapp.domain.Author; -import org.springframework.data.repository.CrudRepository; - -public interface AuthorRepositories extends CrudRepository{ -} diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java new file mode 100644 index 000000000..444b5fcd2 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/AuthorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository{ +} diff --git a/src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java similarity index 74% rename from src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java rename to src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java index 8cb8f1ae8..7524fa013 100644 --- a/src/main/java/guru/springframework/spring6webapp/domain/repositories/BookRepository.java +++ b/src/main/java/guru/springframework/spring6webapp/repositories/BookRepository.java @@ -1,4 +1,4 @@ -package guru.springframework.spring6webapp.domain.repositories; +package guru.springframework.spring6webapp.repositories; import guru.springframework.spring6webapp.domain.Book; import org.springframework.data.repository.CrudRepository;