diff --git a/pom.xml b/pom.xml index 922b9c237..3d2fab699 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,11 @@ spring-boot-starter-test test + + jakarta.persistence + jakarta.persistence-api + 3.1.0 + @@ -45,6 +50,14 @@ org.springframework.boot spring-boot-maven-plugin + + org.apache.maven.plugins + maven-compiler-plugin + + 16 + 16 + + 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..e68ed1dd5 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/bootstrap/BootstrapData.java @@ -0,0 +1,62 @@ +package guru.springframework.spring6webapp.bootstrap; + +import guru.springframework.spring6webapp.domain.Author; +import guru.springframework.spring6webapp.domain.Book; +import guru.springframework.spring6webapp.repositories.IAuthorRepositroy; +import guru.springframework.spring6webapp.repositories.IBookRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component // This annotation indicates that this class is a Spring component and will be automatically detected by Spring's component scanning +public class BootstrapData implements CommandLineRunner { + + private final IAuthorRepositroy iAuthorRepositroy; + private final IBookRepository iBookRepository; + + public BootstrapData(IAuthorRepositroy iAuthorRepositroy, IBookRepository iBookRepository) { + this.iAuthorRepositroy = iAuthorRepositroy; + this.iBookRepository = iBookRepository; + } + + + @Override + public void run(String... args) throws Exception { + Author author1 = new Author(); + author1.setFirstName("Nabil"); + author1.setLastName("Boutachrafine"); + + Book book1 = new Book(); + book1.setTitle("Spring Framework 6"); + book1.setIsbn("1234567890"); + + Author authorSaved1 = iAuthorRepositroy.save(author1); + Book bookSaved1 = iBookRepository.save(book1); + + Author author2 = new Author(); + author2.setFirstName("Tawfiq"); + author2.setLastName("Boutachrafine"); + + Book book2 = new Book(); + book2.setTitle("Spring Boot 3"); + book2.setIsbn("0987654321"); + + Author authorSaved2 = iAuthorRepositroy.save(author2); + Book bookSaved2 = iBookRepository.save(book2); + + authorSaved1.getBooks().add(bookSaved1); + authorSaved2.getBooks().add(bookSaved2); + + iAuthorRepositroy.save(authorSaved1); + iAuthorRepositroy.save(authorSaved2); + + System.out.println("Bootstrap Data Loaded"); + System.out.println("Number of Authors: " + iAuthorRepositroy.count()); + System.out.println("Number of Books: " + iBookRepository.count()); + } +} + + + + + + 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..a60b50faf --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Author.java @@ -0,0 +1,78 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity // this annotation indicates that this class is a JPA entity +public class Author { + @Id // This annotation indicates that this field is the primary key of the entity + @GeneratedValue (strategy = GenerationType.AUTO) // this annotation specifies that the primary key will be generated automatically + private Long idAuthor; + private String firstName; + private String lastName; + + @ManyToMany(mappedBy = "authors") // this annotation indicates a many-to-many relationship with the Book entity + private Set books = new HashSet<>(); + + public Long getIdAuthor() { + return idAuthor; + } + + public void setIdAuthor(Long idAuthor) { + this.idAuthor = idAuthor; + } + + 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 String toString() { + return "Author{" + + "idAuthor=" + idAuthor + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + '}'; + } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof Author author)) return false; + + return Objects.equals(getIdAuthor(), author.getIdAuthor()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getIdAuthor()); + } + +} + + + + + 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..34578ae42 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/domain/Book.java @@ -0,0 +1,79 @@ +package guru.springframework.spring6webapp.domain; + +import jakarta.persistence.*; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +public class Book { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long idBook; + private String title; + private String isbn; + + @ManyToMany + @JoinTable(name ="author_book", joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "author_id")) // This annotation defines the join table for the many-to-many relationship + private Set authors = new HashSet<>(); + + public Long getIdBook() { + return idBook; + } + + public void setIdBook(Long idBook) { + this.idBook = idBook; + } + + 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 String toString() { + return "Book{" + + "idBook=" + idBook + + ", title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + '}'; + } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof Book book)) return false; + + return Objects.equals(getIdBook(), book.getIdBook()); + } + + @Override + public int hashCode() { + return Objects.hashCode(getIdBook()); + } + +} + + + + diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/IAuthorRepositroy.java b/src/main/java/guru/springframework/spring6webapp/repositories/IAuthorRepositroy.java new file mode 100644 index 000000000..3b57b6ae6 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/IAuthorRepositroy.java @@ -0,0 +1,8 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface IAuthorRepositroy extends CrudRepository { + +} diff --git a/src/main/java/guru/springframework/spring6webapp/repositories/IBookRepository.java b/src/main/java/guru/springframework/spring6webapp/repositories/IBookRepository.java new file mode 100644 index 000000000..c6c3e9a64 --- /dev/null +++ b/src/main/java/guru/springframework/spring6webapp/repositories/IBookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring6webapp.repositories; + +import guru.springframework.spring6webapp.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface IBookRepository extends CrudRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b1378917..642fb429b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,2 @@ - +server.port=9090 +//spring.jpa.open-in-view=false \ No newline at end of file diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml new file mode 100644 index 000000000..d80081d13 --- /dev/null +++ b/web/WEB-INF/web.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file