From ed46b8552ca47a5bed0e312854fe753f7526c2ee Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 13:13:59 -0400 Subject: [PATCH 01/36] adding domain object --- .../sdjpaintro/domain/Book.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/main/java/guru/springframework/sdjpaintro/domain/Book.java diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java new file mode 100644 index 00000000..0cab5b0d --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java @@ -0,0 +1,63 @@ +package guru.springframework.sdjpaintro.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * Created by jt on 6/12/21. + */ +@Entity +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + private String isbn; + private String publisher; + + public Book() { + + } + + public Book(String title, String isbn, String publisher) { + this.title = title; + this.isbn = isbn; + this.publisher = publisher; + } + + 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 String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } +} From 49b8e4a35ed3aa7a065edc9885afdd0adc41b533 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 13:26:42 -0400 Subject: [PATCH 02/36] adding equals and hash --- .../springframework/sdjpaintro/domain/Book.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java index 0cab5b0d..87d7907b 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java @@ -4,6 +4,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import java.util.Objects; /** * Created by jt on 6/12/21. @@ -29,6 +30,21 @@ public Book(String title, String isbn, 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 Objects.equals(id, book.id); + } + + @Override + public int hashCode() { + return id != null ? id.hashCode() : 0; + } + public Long getId() { return id; } From 784d63141b6e8d816812f5db90e6c3e789b525ab Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 13:47:44 -0400 Subject: [PATCH 03/36] adding repo --- .../sdjpaintro/repositories/BookRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/guru/springframework/sdjpaintro/repositories/BookRepository.java diff --git a/src/main/java/guru/springframework/sdjpaintro/repositories/BookRepository.java b/src/main/java/guru/springframework/sdjpaintro/repositories/BookRepository.java new file mode 100644 index 00000000..ad3b6850 --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/repositories/BookRepository.java @@ -0,0 +1,10 @@ +package guru.springframework.sdjpaintro.repositories; + +import guru.springframework.sdjpaintro.domain.Book; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * Created by jt on 6/12/21. + */ +public interface BookRepository extends JpaRepository { +} From c40df5b48cc017ac5a31fc901719a7e4d978de3f Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 14:15:33 -0400 Subject: [PATCH 04/36] adding init data --- .../sdjpaintro/bootstrap/DataInitializer.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java new file mode 100644 index 00000000..76bfd5db --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -0,0 +1,39 @@ +package guru.springframework.sdjpaintro.bootstrap; + +import guru.springframework.sdjpaintro.domain.Book; +import guru.springframework.sdjpaintro.repositories.BookRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +/** + * Created by jt on 6/12/21. + */ +@Component +public class DataInitializer implements CommandLineRunner { + + private final BookRepository bookRepository; + + public DataInitializer(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + @Override + public void run(String... args) throws Exception { + Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse"); + + System.out.println("Id: " + bookDDD.getId() ); + + Book savedDDD = bookRepository.save(bookDDD); + + System.out.println("Id: " + savedDDD.getId() ); + + Book bookSIA = new Book("Spring In Action", "234234", "Oriely"); + Book savedSIA = bookRepository.save(bookSIA); + + bookRepository.findAll().forEach(book -> { + System.out.println("Book Id: " + book.getId()); + System.out.println("Book Title: " + book.getTitle()); + }); + + } +} From bd84b582fbf054f20208b7bfdeb0ac2716e7b509 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 14:25:12 -0400 Subject: [PATCH 05/36] show sql statements --- src/main/resources/application.properties | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891..2f0f9ac0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,10 @@ +#spring.jpa.show-sql=true +#Show SQL +spring.jpa.properties.hibernate.show_sql=true + +#Format SQL +spring.jpa.properties.hibernate.format_sql=true + +#Show bind values +logging.level.org.hibernate.type.descriptor.sql=trace \ No newline at end of file From bb4e2b3567e640328cc46744a3cabb17e4705067 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 12 Jun 2021 14:38:52 -0400 Subject: [PATCH 06/36] adding h2 console --- src/main/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2f0f9ac0..ef4ecdca 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,4 +7,6 @@ spring.jpa.properties.hibernate.show_sql=true spring.jpa.properties.hibernate.format_sql=true #Show bind values -logging.level.org.hibernate.type.descriptor.sql=trace \ No newline at end of file +logging.level.org.hibernate.type.descriptor.sql=trace + +spring.h2.console.enabled=true \ No newline at end of file From 8883657d08e7ee348b69bee7b0a116e67cd40f5b Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 3 Jul 2021 10:28:40 -0400 Subject: [PATCH 07/36] adding mysql user scripts --- src/main/scripts/mysqlusers.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/scripts/mysqlusers.sql diff --git a/src/main/scripts/mysqlusers.sql b/src/main/scripts/mysqlusers.sql new file mode 100644 index 00000000..9c8e6caa --- /dev/null +++ b/src/main/scripts/mysqlusers.sql @@ -0,0 +1,10 @@ +DROP DATABASE IF EXISTS bookdb; +DROP USER IF EXISTS `bookadmin`@`%`; +DROP USER IF EXISTS `bookuser`@`%`; +CREATE DATABASE IF NOT EXISTS bookbd CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE USER IF NOT EXISTS `bookadmin`@`%` IDENTIFIED WITH mysql_native_password BY 'password'; +GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, +CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `bookdb`.* TO `bookadmin`@`%`; +CREATE USER IF NOT EXISTS `bookuser`@`%` IDENTIFIED WITH mysql_native_password BY 'password'; +GRANT SELECT, INSERT, UPDATE, DELETE, SHOW VIEW ON `bookdb`.* TO `bookuser`@`%`; +FLUSH PRIVILEGES; \ No newline at end of file From 3dcaab4dfadcf87a92f61e7069a3f1b986fde4bc Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 3 Jul 2021 10:58:54 -0400 Subject: [PATCH 08/36] adding db test --- .../sdjpaintro/SdjpaIntroApplicationTests.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/test/java/guru/springframework/sdjpaintro/SdjpaIntroApplicationTests.java b/src/test/java/guru/springframework/sdjpaintro/SdjpaIntroApplicationTests.java index 9fbb1484..012fec60 100644 --- a/src/test/java/guru/springframework/sdjpaintro/SdjpaIntroApplicationTests.java +++ b/src/test/java/guru/springframework/sdjpaintro/SdjpaIntroApplicationTests.java @@ -1,11 +1,25 @@ package guru.springframework.sdjpaintro; +import guru.springframework.sdjpaintro.repositories.BookRepository; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + @SpringBootTest class SdjpaIntroApplicationTests { + @Autowired + BookRepository bookRepository; + + @Test + void testBookRepository() { + long count = bookRepository.count(); + + assertThat(count).isGreaterThan(0); + } + @Test void contextLoads() { } From 97387411272f1a2ee0b59439ebea0a29a46a85b1 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 3 Jul 2021 11:28:42 -0400 Subject: [PATCH 09/36] adding test splice --- .../sdjpaintro/SpringBootJpaTestSlice.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java diff --git a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java new file mode 100644 index 00000000..780261ce --- /dev/null +++ b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java @@ -0,0 +1,30 @@ +package guru.springframework.sdjpaintro; + +import guru.springframework.sdjpaintro.domain.Book; +import guru.springframework.sdjpaintro.repositories.BookRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +/** + * Created by jt on 7/3/21. + */ +@DataJpaTest +public class SpringBootJpaTestSlice { + + @Autowired + BookRepository bookRepository; + + @Test + void testJpaTestSplice() { + long countBefore = bookRepository.count(); + + bookRepository.save(new Book("My Book", "1235555", "Self")); + + long countAfter = bookRepository.count(); + + assertThat(countBefore).isLessThan(countAfter); + } +} From 31df8f57323105058b58fe3ac8f75da2732b9f52 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 3 Jul 2021 12:00:36 -0400 Subject: [PATCH 10/36] adding transaction demo --- .../sdjpaintro/SpringBootJpaTestSlice.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java index 780261ce..86524897 100644 --- a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java +++ b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java @@ -2,24 +2,33 @@ import guru.springframework.sdjpaintro.domain.Book; import guru.springframework.sdjpaintro.repositories.BookRepository; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.annotation.Commit; +import org.springframework.test.annotation.Rollback; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; /** * Created by jt on 7/3/21. */ +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DataJpaTest public class SpringBootJpaTestSlice { @Autowired BookRepository bookRepository; + @Commit + @Order(1) @Test void testJpaTestSplice() { long countBefore = bookRepository.count(); + assertThat(countBefore).isEqualTo(0); bookRepository.save(new Book("My Book", "1235555", "Self")); @@ -27,4 +36,12 @@ void testJpaTestSplice() { assertThat(countBefore).isLessThan(countAfter); } + + @Order(2) + @Test + void testJpaTestSpliceTransaction() { + long countBefore = bookRepository.count(); + assertThat(countBefore).isEqualTo(1); + + } } From 0931be320943db4d6fe14e2489ab048471c7d319 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 3 Jul 2021 12:21:45 -0400 Subject: [PATCH 11/36] adding bootstrap back to config for test splice --- .../springframework/sdjpaintro/SpringBootJpaTestSlice.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java index 86524897..cd6a7e0c 100644 --- a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java +++ b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.test.annotation.Commit; import org.springframework.test.annotation.Rollback; @@ -18,6 +19,7 @@ */ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DataJpaTest +@ComponentScan(basePackages = {"guru.springframework.sdjpaintro.bootstrap"}) public class SpringBootJpaTestSlice { @Autowired @@ -28,7 +30,7 @@ public class SpringBootJpaTestSlice { @Test void testJpaTestSplice() { long countBefore = bookRepository.count(); - assertThat(countBefore).isEqualTo(0); + assertThat(countBefore).isEqualTo(2); bookRepository.save(new Book("My Book", "1235555", "Self")); @@ -41,7 +43,7 @@ void testJpaTestSplice() { @Test void testJpaTestSpliceTransaction() { long countBefore = bookRepository.count(); - assertThat(countBefore).isEqualTo(1); + assertThat(countBefore).isEqualTo(3); } } From 0c9fb40bd9573c9ba50f314959c7ca993a1a8da9 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 09:06:20 -0400 Subject: [PATCH 12/36] Fix typo in script --- src/main/scripts/mysqlusers.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scripts/mysqlusers.sql b/src/main/scripts/mysqlusers.sql index 9c8e6caa..05934cac 100644 --- a/src/main/scripts/mysqlusers.sql +++ b/src/main/scripts/mysqlusers.sql @@ -1,7 +1,7 @@ DROP DATABASE IF EXISTS bookdb; DROP USER IF EXISTS `bookadmin`@`%`; DROP USER IF EXISTS `bookuser`@`%`; -CREATE DATABASE IF NOT EXISTS bookbd CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +CREATE DATABASE IF NOT EXISTS bookdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER IF NOT EXISTS `bookadmin`@`%` IDENTIFIED WITH mysql_native_password BY 'password'; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `bookdb`.* TO `bookadmin`@`%`; From 9acccc4c0d90e7222d29dbba65351da5784cb8aa Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 11:59:13 -0400 Subject: [PATCH 13/36] adding mySQL config --- pom.xml | 6 +++++- src/main/resources/application-local.properties | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/application-local.properties diff --git a/pom.xml b/pom.xml index 4c8f100c..8aa9710f 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,11 @@ com.h2database h2 - runtime + test + + + mysql + mysql-connector-java org.springframework.boot diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties new file mode 100644 index 00000000..4eaa4b08 --- /dev/null +++ b/src/main/resources/application-local.properties @@ -0,0 +1,5 @@ +spring.datasource.username=bookadmin +spring.datasource.password=password +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC +spring.jpa.database=mysql +spring.jpa.hibernate.ddl-auto=update From dbf1568d7171db0eff3c28a006f29323aa298dd1 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 12:28:51 -0400 Subject: [PATCH 14/36] adding mysql integration test --- .../sdjpaintro/bootstrap/DataInitializer.java | 9 +++-- .../sdjpaintro/MySQLIntegrationTest.java | 35 +++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 src/test/java/guru/springframework/sdjpaintro/MySQLIntegrationTest.java diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java index 76bfd5db..2d37d629 100644 --- a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -3,11 +3,13 @@ import guru.springframework.sdjpaintro.domain.Book; import guru.springframework.sdjpaintro.repositories.BookRepository; import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; /** * Created by jt on 6/12/21. */ +@Profile({"local", "default"}) @Component public class DataInitializer implements CommandLineRunner { @@ -19,14 +21,11 @@ public DataInitializer(BookRepository bookRepository) { @Override public void run(String... args) throws Exception { - Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse"); - - System.out.println("Id: " + bookDDD.getId() ); + bookRepository.deleteAll(); + Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse"); Book savedDDD = bookRepository.save(bookDDD); - System.out.println("Id: " + savedDDD.getId() ); - Book bookSIA = new Book("Spring In Action", "234234", "Oriely"); Book savedSIA = bookRepository.save(bookSIA); diff --git a/src/test/java/guru/springframework/sdjpaintro/MySQLIntegrationTest.java b/src/test/java/guru/springframework/sdjpaintro/MySQLIntegrationTest.java new file mode 100644 index 00000000..77c19a6d --- /dev/null +++ b/src/test/java/guru/springframework/sdjpaintro/MySQLIntegrationTest.java @@ -0,0 +1,35 @@ +package guru.springframework.sdjpaintro; + +import guru.springframework.sdjpaintro.repositories.BookRepository; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.ActiveProfiles; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +/** + * Created by jt on 7/4/21. + */ +@ActiveProfiles("local") +@DataJpaTest +@ComponentScan(basePackages = {"guru.springframework.sdjpaintro.bootstrap"}) +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +public class MySQLIntegrationTest { + + @Autowired + BookRepository bookRepository; + + @Test + void testMySQL() { + long countBefore = bookRepository.count(); + assertThat(countBefore).isEqualTo(2); + + } + +} + + From 9c952671b04c0f46d0689036337d05a4ec14b51d Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 13:57:59 -0400 Subject: [PATCH 15/36] adding h2-compatibility mode --- src/main/resources/application-local.properties | 2 +- src/main/resources/application.properties | 9 ++++++++- .../sdjpaintro/SpringBootJpaTestSlice.java | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 4eaa4b08..d624853b 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -1,5 +1,5 @@ spring.datasource.username=bookadmin spring.datasource.password=password spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC -spring.jpa.database=mysql + spring.jpa.hibernate.ddl-auto=update diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ef4ecdca..f0f376ac 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,4 +9,11 @@ spring.jpa.properties.hibernate.format_sql=true #Show bind values logging.level.org.hibernate.type.descriptor.sql=trace -spring.h2.console.enabled=true \ No newline at end of file +spring.h2.console.enabled=true + +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database=mysql +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect +spring.jpa.hibernate.ddl-auto=update \ No newline at end of file diff --git a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java index cd6a7e0c..deed8bf8 100644 --- a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java +++ b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.annotation.Commit; @@ -20,6 +21,7 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DataJpaTest @ComponentScan(basePackages = {"guru.springframework.sdjpaintro.bootstrap"}) +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) public class SpringBootJpaTestSlice { @Autowired From 42ebb390dbc6645c0454765ff3c30d63cba799de Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 14:36:42 -0400 Subject: [PATCH 16/36] adding mysql integration test --- src/main/resources/application.properties | 3 ++- src/main/resources/schema.sql | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/schema.sql diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f0f376ac..ba099192 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -16,4 +16,5 @@ spring.datasource.username=sa spring.datasource.password=password spring.jpa.database=mysql spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file +spring.jpa.hibernate.ddl-auto=validate +spring.jpa.defer-datasource-initialization=false \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 00000000..0e1f02c5 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,16 @@ +drop table if exists book; +drop table if exists hibernate_sequence; + +create table book ( + id bigint not null, + isbn varchar(255), + publisher varchar(255), + title varchar(255), + primary key (id) +) engine=InnoDB; + +create table hibernate_sequence ( + next_val bigint +) engine=InnoDB; + +insert into hibernate_sequence values ( 1 ); \ No newline at end of file From c18b2f25dac99c3eade1da9e8543349ce80e94e0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 4 Jul 2021 14:45:06 -0400 Subject: [PATCH 17/36] adding mySql init --- src/main/resources/application-local.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index d624853b..8388dc0a 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -2,4 +2,6 @@ spring.datasource.username=bookadmin spring.datasource.password=password spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=validate + +spring.sql.init.mode=always From 3ced3fb80a60b6c5acc97a74fb9769b4c672d790 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 14 Aug 2021 12:17:58 -0400 Subject: [PATCH 18/36] adding h2 profile --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 8aa9710f..4821ad79 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,18 @@ + + + h2 + + + com.h2database + h2 + + + + + From 7233e1b8dd563061bdff91c6824b1f36aeda78f0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 14 Aug 2021 16:07:32 -0400 Subject: [PATCH 19/36] flyway springboot config --- pom.xml | 4 ++++ src/main/resources/application-local.properties | 5 ++++- .../{schema.sql => db/migration/V1__init_database.sql} | 0 3 files changed, 8 insertions(+), 1 deletion(-) rename src/main/resources/{schema.sql => db/migration/V1__init_database.sql} (100%) diff --git a/pom.xml b/pom.xml index 4821ad79..c4801dd2 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,10 @@ org.springframework.boot spring-boot-starter-web + + org.flywaydb + flyway-core + com.h2database diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 8388dc0a..122eccd4 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -1,7 +1,10 @@ -spring.datasource.username=bookadmin +spring.datasource.username=bookuser spring.datasource.password=password spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bookdb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC spring.jpa.hibernate.ddl-auto=validate spring.sql.init.mode=always + +spring.flyway.user=bookadmin +spring.flyway.password=password \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/db/migration/V1__init_database.sql similarity index 100% rename from src/main/resources/schema.sql rename to src/main/resources/db/migration/V1__init_database.sql From 5f9fc22318b3310450d996d53f0f3a50152508e5 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sat, 14 Aug 2021 16:29:16 -0400 Subject: [PATCH 20/36] adding Author table --- .../sdjpaintro/domain/Author.java | 58 +++++++++++++++++++ .../resources/db/migration/V2__add_author.sql | 7 +++ 2 files changed, 65 insertions(+) create mode 100644 src/main/java/guru/springframework/sdjpaintro/domain/Author.java create mode 100644 src/main/resources/db/migration/V2__add_author.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Author.java b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java new file mode 100644 index 00000000..035f7d76 --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java @@ -0,0 +1,58 @@ +package guru.springframework.sdjpaintro.domain; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +/** + * Created by jt on 8/14/21. + */ +@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; + } + + @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; + } +} diff --git a/src/main/resources/db/migration/V2__add_author.sql b/src/main/resources/db/migration/V2__add_author.sql new file mode 100644 index 00000000..f82a5e89 --- /dev/null +++ b/src/main/resources/db/migration/V2__add_author.sql @@ -0,0 +1,7 @@ +create table author +( + id bigint not null, + first_name varchar(255), + last_name varchar(255), + primary key (id) +) engine = InnoDB; \ No newline at end of file From e29046b0c765c05c42fb90aa52d81d6f99decaa7 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 08:38:51 -0400 Subject: [PATCH 21/36] adding alter table example --- .../sdjpaintro/bootstrap/DataInitializer.java | 4 ++-- .../guru/springframework/sdjpaintro/domain/Book.java | 12 +++++++++++- .../db/migration/V3__add_author_id_to_book.sql | 1 + .../sdjpaintro/SpringBootJpaTestSlice.java | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/migration/V3__add_author_id_to_book.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java index 2d37d629..12a31e20 100644 --- a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -23,10 +23,10 @@ public DataInitializer(BookRepository bookRepository) { public void run(String... args) throws Exception { bookRepository.deleteAll(); - Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse"); + Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse", null); Book savedDDD = bookRepository.save(bookDDD); - Book bookSIA = new Book("Spring In Action", "234234", "Oriely"); + Book bookSIA = new Book("Spring In Action", "234234", "Oriely", null); Book savedSIA = bookRepository.save(bookSIA); bookRepository.findAll().forEach(book -> { diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java index 87d7907b..8f046305 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java @@ -19,15 +19,17 @@ public class Book { private String title; private String isbn; private String publisher; + private Long authorId; public Book() { } - public Book(String title, String isbn, String publisher) { + public Book(String title, String isbn, String publisher, Long authorId) { this.title = title; this.isbn = isbn; this.publisher = publisher; + this.authorId = authorId; } @Override @@ -76,4 +78,12 @@ public String getPublisher() { public void setPublisher(String publisher) { this.publisher = publisher; } + + public Long getAuthorId() { + return authorId; + } + + public void setAuthorId(Long authorId) { + this.authorId = authorId; + } } diff --git a/src/main/resources/db/migration/V3__add_author_id_to_book.sql b/src/main/resources/db/migration/V3__add_author_id_to_book.sql new file mode 100644 index 00000000..404f3a15 --- /dev/null +++ b/src/main/resources/db/migration/V3__add_author_id_to_book.sql @@ -0,0 +1 @@ +alter table book ADD author_id BIGINT; \ No newline at end of file diff --git a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java index deed8bf8..fe45a153 100644 --- a/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java +++ b/src/test/java/guru/springframework/sdjpaintro/SpringBootJpaTestSlice.java @@ -34,7 +34,7 @@ void testJpaTestSplice() { long countBefore = bookRepository.count(); assertThat(countBefore).isEqualTo(2); - bookRepository.save(new Book("My Book", "1235555", "Self")); + bookRepository.save(new Book("My Book", "1235555", "Self", null)); long countAfter = bookRepository.count(); From 8fe82cda0e7c13dce1d43f407a47736a05c919af Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 08:46:57 -0400 Subject: [PATCH 22/36] adding flyway clean --- .../sdjpaintro/config/DbClean.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/guru/springframework/sdjpaintro/config/DbClean.java diff --git a/src/main/java/guru/springframework/sdjpaintro/config/DbClean.java b/src/main/java/guru/springframework/sdjpaintro/config/DbClean.java new file mode 100644 index 00000000..fef30bbc --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/config/DbClean.java @@ -0,0 +1,22 @@ +package guru.springframework.sdjpaintro.config; + +import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +/** + * Created by jt on 8/15/21. + */ +@Profile("clean") +@Configuration +public class DbClean { + + @Bean + public FlywayMigrationStrategy clean(){ + return flyway -> { + flyway.clean(); + flyway.migrate(); + }; + } +} From a793280b1f9729207948d73ae9f6eca3744d0ae6 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 11:39:53 -0400 Subject: [PATCH 23/36] adding auto increment example --- .../java/guru/springframework/sdjpaintro/domain/Author.java | 2 +- src/main/java/guru/springframework/sdjpaintro/domain/Book.java | 2 +- src/main/resources/db/migration/V4__autoincrement_pk.sql | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/db/migration/V4__autoincrement_pk.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Author.java b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java index 035f7d76..35c3f25d 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Author.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java @@ -11,7 +11,7 @@ @Entity public class Author { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String firstName; diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java index 8f046305..b4601daf 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java @@ -13,7 +13,7 @@ public class Book { @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; diff --git a/src/main/resources/db/migration/V4__autoincrement_pk.sql b/src/main/resources/db/migration/V4__autoincrement_pk.sql new file mode 100644 index 00000000..54a97e57 --- /dev/null +++ b/src/main/resources/db/migration/V4__autoincrement_pk.sql @@ -0,0 +1,2 @@ +alter table book change id id BIGINT auto_increment; +alter table author change id id BIGINT auto_increment; \ No newline at end of file From c199bfd9aa0b0085c6d70038d2ec9d6dd8e5ee80 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 12:40:04 -0400 Subject: [PATCH 24/36] adding author uuid --- .../sdjpaintro/bootstrap/DataInitializer.java | 13 +++++- .../sdjpaintro/domain/AuthorUuid.java | 46 +++++++++++++++++++ .../repositories/AuthorUuidRepository.java | 12 +++++ .../db/migration/V5__author_uuid.sql | 7 +++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java create mode 100644 src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java create mode 100644 src/main/resources/db/migration/V5__author_uuid.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java index 12a31e20..dd02b510 100644 --- a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -1,6 +1,9 @@ package guru.springframework.sdjpaintro.bootstrap; +import guru.springframework.sdjpaintro.domain.AuthorUuid; import guru.springframework.sdjpaintro.domain.Book; + +import guru.springframework.sdjpaintro.repositories.AuthorUuidRepository; import guru.springframework.sdjpaintro.repositories.BookRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Profile; @@ -14,14 +17,17 @@ public class DataInitializer implements CommandLineRunner { private final BookRepository bookRepository; + private final AuthorUuidRepository authorUuidRepository; - public DataInitializer(BookRepository bookRepository) { + public DataInitializer(BookRepository bookRepository, AuthorUuidRepository authorUuidRepository) { this.bookRepository = bookRepository; + this.authorUuidRepository = authorUuidRepository; } @Override public void run(String... args) throws Exception { bookRepository.deleteAll(); + authorUuidRepository.deleteAll(); Book bookDDD = new Book("Domain Driven Design", "123", "RandomHouse", null); Book savedDDD = bookRepository.save(bookDDD); @@ -34,5 +40,10 @@ public void run(String... args) throws Exception { System.out.println("Book Title: " + book.getTitle()); }); + AuthorUuid authorUuid = new AuthorUuid(); + authorUuid.setFirstName("Joe"); + authorUuid.setLastName("Buck"); + AuthorUuid savedAuthor = authorUuidRepository.save(authorUuid); + System.out.printf("Saved Author UUID: " + savedAuthor.getId() ); } } diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java new file mode 100644 index 00000000..f72cbe17 --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java @@ -0,0 +1,46 @@ +package guru.springframework.sdjpaintro.domain; + +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.UUID; + +/** + * Created by jt on 8/15/21. + */ +@Entity +public class AuthorUuid { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Type(type = "org.hibernate.type.UUIDCharType") + @Column(length = 36, columnDefinition = "varchar(36)", updatable = false, nullable = false ) + private UUID id; + + private String firstName; + private String lastName; + + public UUID getId() { + return id; + } + + public void setId(UUID 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/sdjpaintro/repositories/AuthorUuidRepository.java b/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java new file mode 100644 index 00000000..ca7bb65c --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java @@ -0,0 +1,12 @@ +package guru.springframework.sdjpaintro.repositories; + +import guru.springframework.sdjpaintro.domain.AuthorUuid; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +/** + * Created by jt on 8/15/21. + */ +public interface AuthorUuidRepository extends JpaRepository { +} diff --git a/src/main/resources/db/migration/V5__author_uuid.sql b/src/main/resources/db/migration/V5__author_uuid.sql new file mode 100644 index 00000000..16d2df8c --- /dev/null +++ b/src/main/resources/db/migration/V5__author_uuid.sql @@ -0,0 +1,7 @@ +create table author_uuid +( + id varchar(36) not null, + first_name varchar(255), + last_name varchar(255), + primary key (id) +) engine = InnoDB; \ No newline at end of file From dff7ba624b4ffb857f9fe1339b3fa7fe48e5f396 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 12:48:44 -0400 Subject: [PATCH 25/36] fixed typo --- .../springframework/sdjpaintro/bootstrap/DataInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java index dd02b510..2ec32037 100644 --- a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -44,6 +44,6 @@ public void run(String... args) throws Exception { authorUuid.setFirstName("Joe"); authorUuid.setLastName("Buck"); AuthorUuid savedAuthor = authorUuidRepository.save(authorUuid); - System.out.printf("Saved Author UUID: " + savedAuthor.getId() ); + System.out.println("Saved Author UUID: " + savedAuthor.getId() ); } } From 1a73cccb37905a46792f29540125ed53de088927 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Sun, 15 Aug 2021 13:18:27 -0400 Subject: [PATCH 26/36] adding uuid2 example --- .../sdjpaintro/bootstrap/DataInitializer.java | 11 +++- .../sdjpaintro/domain/BookUuid.java | 55 +++++++++++++++++++ .../repositories/BookUuidRepository.java | 12 ++++ .../resources/db/migration/V6__book_uuid.sql | 7 +++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java create mode 100644 src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java create mode 100644 src/main/resources/db/migration/V6__book_uuid.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java index 2ec32037..9c561416 100644 --- a/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java +++ b/src/main/java/guru/springframework/sdjpaintro/bootstrap/DataInitializer.java @@ -3,8 +3,10 @@ import guru.springframework.sdjpaintro.domain.AuthorUuid; import guru.springframework.sdjpaintro.domain.Book; +import guru.springframework.sdjpaintro.domain.BookUuid; import guru.springframework.sdjpaintro.repositories.AuthorUuidRepository; import guru.springframework.sdjpaintro.repositories.BookRepository; +import guru.springframework.sdjpaintro.repositories.BookUuidRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @@ -18,10 +20,12 @@ public class DataInitializer implements CommandLineRunner { private final BookRepository bookRepository; private final AuthorUuidRepository authorUuidRepository; + private final BookUuidRepository bookUuidRepository; - public DataInitializer(BookRepository bookRepository, AuthorUuidRepository authorUuidRepository) { + public DataInitializer(BookRepository bookRepository, AuthorUuidRepository authorUuidRepository, BookUuidRepository bookUuidRepository) { this.bookRepository = bookRepository; this.authorUuidRepository = authorUuidRepository; + this.bookUuidRepository = bookUuidRepository; } @Override @@ -45,5 +49,10 @@ public void run(String... args) throws Exception { authorUuid.setLastName("Buck"); AuthorUuid savedAuthor = authorUuidRepository.save(authorUuid); System.out.println("Saved Author UUID: " + savedAuthor.getId() ); + + BookUuid bookUuid = new BookUuid(); + bookUuid.setTitle("All About UUIDs"); + BookUuid savedBookUuid = bookUuidRepository.save(bookUuid); + System.out.println("Saved Book UUID: " + savedBookUuid.getId()); } } diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java new file mode 100644 index 00000000..4c1aa6b8 --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java @@ -0,0 +1,55 @@ +package guru.springframework.sdjpaintro.domain; + +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.util.UUID; + +/** + * Created by jt on 8/15/21. + */ +@Entity +public class BookUuid { + @Id + @GeneratedValue(generator = "uuid2") + @GenericGenerator(name = "uuid2", strategy = "uuid2") + @Column(columnDefinition = "BINARY(16)", updatable = false, nullable = false) + private UUID id; + + private String title; + private String isbn; + private String publisher; + + public UUID getId() { + return id; + } + + public void setId(UUID 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 String getPublisher() { + return publisher; + } + + public void setPublisher(String publisher) { + this.publisher = publisher; + } + +} diff --git a/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java b/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java new file mode 100644 index 00000000..dfb53d23 --- /dev/null +++ b/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java @@ -0,0 +1,12 @@ +package guru.springframework.sdjpaintro.repositories; + +import guru.springframework.sdjpaintro.domain.BookUuid; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +/** + * Created by jt on 8/15/21. + */ +public interface BookUuidRepository extends JpaRepository { +} diff --git a/src/main/resources/db/migration/V6__book_uuid.sql b/src/main/resources/db/migration/V6__book_uuid.sql new file mode 100644 index 00000000..2bf92659 --- /dev/null +++ b/src/main/resources/db/migration/V6__book_uuid.sql @@ -0,0 +1,7 @@ +create table book_uuid ( + id binary(16) not null, + isbn varchar(255), + publisher varchar(255), + title varchar(255), + primary key (id) +) engine=InnoDB; \ No newline at end of file From 1a630eb2d341e0ccea85fe306936722cac290ac1 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 16 Aug 2021 13:51:07 -0400 Subject: [PATCH 27/36] adding h2 migration --- src/main/resources/application.properties | 3 ++- .../{ => common}/V1__init_database.sql | 0 .../migration/{ => common}/V2__add_author.sql | 0 .../V3__add_author_id_to_book.sql | 0 .../{ => common}/V4__autoincrement_pk.sql | 0 .../db/migration/h2/V4.1__h2_auto.sql | 19 +++++++++++++++++++ 6 files changed, 21 insertions(+), 1 deletion(-) rename src/main/resources/db/migration/{ => common}/V1__init_database.sql (100%) rename src/main/resources/db/migration/{ => common}/V2__add_author.sql (100%) rename src/main/resources/db/migration/{ => common}/V3__add_author_id_to_book.sql (100%) rename src/main/resources/db/migration/{ => common}/V4__autoincrement_pk.sql (100%) create mode 100644 src/main/resources/db/migration/h2/V4.1__h2_auto.sql diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ba099192..21205ea6 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,4 +17,5 @@ spring.datasource.password=password spring.jpa.database=mysql spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.jpa.hibernate.ddl-auto=validate -spring.jpa.defer-datasource-initialization=false \ No newline at end of file +spring.jpa.defer-datasource-initialization=false +spring.flyway.locations=classpath:db/migration/common,classpath:db/migration/{vendor} \ No newline at end of file diff --git a/src/main/resources/db/migration/V1__init_database.sql b/src/main/resources/db/migration/common/V1__init_database.sql similarity index 100% rename from src/main/resources/db/migration/V1__init_database.sql rename to src/main/resources/db/migration/common/V1__init_database.sql diff --git a/src/main/resources/db/migration/V2__add_author.sql b/src/main/resources/db/migration/common/V2__add_author.sql similarity index 100% rename from src/main/resources/db/migration/V2__add_author.sql rename to src/main/resources/db/migration/common/V2__add_author.sql diff --git a/src/main/resources/db/migration/V3__add_author_id_to_book.sql b/src/main/resources/db/migration/common/V3__add_author_id_to_book.sql similarity index 100% rename from src/main/resources/db/migration/V3__add_author_id_to_book.sql rename to src/main/resources/db/migration/common/V3__add_author_id_to_book.sql diff --git a/src/main/resources/db/migration/V4__autoincrement_pk.sql b/src/main/resources/db/migration/common/V4__autoincrement_pk.sql similarity index 100% rename from src/main/resources/db/migration/V4__autoincrement_pk.sql rename to src/main/resources/db/migration/common/V4__autoincrement_pk.sql diff --git a/src/main/resources/db/migration/h2/V4.1__h2_auto.sql b/src/main/resources/db/migration/h2/V4.1__h2_auto.sql new file mode 100644 index 00000000..cb2d1cdd --- /dev/null +++ b/src/main/resources/db/migration/h2/V4.1__h2_auto.sql @@ -0,0 +1,19 @@ +drop table if exists book; +drop table if exists author; + +create table book ( + id IDENTITY not null, + isbn varchar(255), + publisher varchar(255), + title varchar(255), + author_id BIGINT, + primary key (id) +); + +create table author +( + id IDENTITY not null, + first_name varchar(255), + last_name varchar(255), + primary key (id) +); \ No newline at end of file From ff934d1a1135ffbda498a13f65ab1504fefcd958 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 16 Aug 2021 13:55:01 -0400 Subject: [PATCH 28/36] updating for h2 migration change --- src/main/resources/db/migration/{ => common}/V5__author_uuid.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{ => common}/V5__author_uuid.sql (100%) diff --git a/src/main/resources/db/migration/V5__author_uuid.sql b/src/main/resources/db/migration/common/V5__author_uuid.sql similarity index 100% rename from src/main/resources/db/migration/V5__author_uuid.sql rename to src/main/resources/db/migration/common/V5__author_uuid.sql From 53b55328a933238fc832124565a6f5bd71c9062a Mon Sep 17 00:00:00 2001 From: John Thompson Date: Mon, 16 Aug 2021 14:13:54 -0400 Subject: [PATCH 29/36] updating for h2 migration change --- src/main/resources/db/migration/{ => common}/V6__book_uuid.sql | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{ => common}/V6__book_uuid.sql (100%) diff --git a/src/main/resources/db/migration/V6__book_uuid.sql b/src/main/resources/db/migration/common/V6__book_uuid.sql similarity index 100% rename from src/main/resources/db/migration/V6__book_uuid.sql rename to src/main/resources/db/migration/common/V6__book_uuid.sql From 03a53dd119ba584ba07ab63349888cb6e8c87e64 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 11:32:51 -0400 Subject: [PATCH 30/36] Updating to Java 17 and Spring Boot 3.x --- .../java/guru/springframework/sdjpaintro/domain/Book.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java index 0cab5b0d..570e8ca5 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Book.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Book.java @@ -1,9 +1,9 @@ package guru.springframework.sdjpaintro.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; /** * Created by jt on 6/12/21. From 1097c51f06ce3e99417bbcbb61e14790412c5552 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 12:34:09 -0400 Subject: [PATCH 31/36] Updating to Java 17 and Spring Boot 3.x - Update Flyway Dep --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 73865524..fa71af21 100644 --- a/pom.xml +++ b/pom.xml @@ -27,7 +27,7 @@ org.flywaydb - flyway-core + flyway-mysql From acda61cf63a1b457f93c96a06f87990731d69af0 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 12:35:24 -0400 Subject: [PATCH 32/36] Updating to Java 17 and Spring Boot 3.x --- .../guru/springframework/sdjpaintro/domain/Author.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/Author.java b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java index 035f7d76..b238f2dc 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/Author.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/Author.java @@ -1,9 +1,9 @@ package guru.springframework.sdjpaintro.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; /** * Created by jt on 8/14/21. From 2416596e545dfc284b1b2edb221bf9e3e3a2d7ce Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 13:43:47 -0400 Subject: [PATCH 33/36] Updating to Java 17 and Spring Boot 3.x - Update Flyway H2 script --- .../db/migration/h2/V4.1__h2_auto.sql | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/resources/db/migration/h2/V4.1__h2_auto.sql b/src/main/resources/db/migration/h2/V4.1__h2_auto.sql index cb2d1cdd..b54f96e2 100644 --- a/src/main/resources/db/migration/h2/V4.1__h2_auto.sql +++ b/src/main/resources/db/migration/h2/V4.1__h2_auto.sql @@ -1,19 +1,20 @@ drop table if exists book; drop table if exists author; -create table book ( - id IDENTITY not null, - isbn varchar(255), - publisher varchar(255), - title varchar(255), - author_id BIGINT, - primary key (id) +create table book +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY not null, + isbn varchar(255), + publisher varchar(255), + title varchar(255), + author_id BIGINT, + primary key (id) ); create table author ( - id IDENTITY not null, + id BIGINT GENERATED BY DEFAULT AS IDENTITY not null, first_name varchar(255), - last_name varchar(255), + last_name varchar(255), primary key (id) ); \ No newline at end of file From acd6101fec51ff070435e0a41dc4ba1f23af9be6 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 15:41:58 -0400 Subject: [PATCH 34/36] Updating to Java 17 and Spring Boot 3.x --- .../java/guru/springframework/sdjpaintro/domain/AuthorUuid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java index f72cbe17..95ac422d 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java @@ -2,7 +2,7 @@ import org.hibernate.annotations.Type; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.UUID; /** From d32a3b446dd926d1fd3c5de56b8b84eed77bd731 Mon Sep 17 00:00:00 2001 From: John Thompson Date: Wed, 6 Jul 2022 15:43:33 -0400 Subject: [PATCH 35/36] Updating to Java 17 and Spring Boot 3.x --- .../java/guru/springframework/sdjpaintro/domain/BookUuid.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java index 4c1aa6b8..de0dc01b 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java @@ -2,7 +2,7 @@ import org.hibernate.annotations.GenericGenerator; -import javax.persistence.*; +import jakarta.persistence.*; import java.util.UUID; /** From c2eadce3d5acb6c6cef2d86bc61195013b530e46 Mon Sep 17 00:00:00 2001 From: "echcherrate.ismail" Date: Mon, 29 Aug 2022 00:24:05 +0200 Subject: [PATCH 36/36] UUID 1 and 2. RFC 4122 Primary Key --- .../sdjpaintro/domain/AuthorUuid.java | 8 +++----- .../sdjpaintro/domain/BookUuid.java | 15 ++++++++++----- .../repositories/AuthorUuidRepository.java | 6 ++---- .../repositories/BookUuidRepository.java | 7 +++---- ...__author_uuid.sql => V5__autoincrement_pk.sql} | 4 ++-- .../db/migration/common/V6__autoincrement_pk.sql | 8 ++++++++ .../db/migration/common/V6__book_uuid.sql | 7 ------- 7 files changed, 28 insertions(+), 27 deletions(-) rename src/main/resources/db/migration/common/{V5__author_uuid.sql => V5__autoincrement_pk.sql} (71%) create mode 100644 src/main/resources/db/migration/common/V6__autoincrement_pk.sql delete mode 100644 src/main/resources/db/migration/common/V6__book_uuid.sql diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java index 95ac422d..b6d94964 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/AuthorUuid.java @@ -1,19 +1,16 @@ package guru.springframework.sdjpaintro.domain; +import jakarta.persistence.*; import org.hibernate.annotations.Type; -import jakarta.persistence.*; import java.util.UUID; -/** - * Created by jt on 8/15/21. - */ @Entity public class AuthorUuid { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Type(type = "org.hibernate.type.UUIDCharType") - @Column(length = 36, columnDefinition = "varchar(36)", updatable = false, nullable = false ) + @Column(length = 36, columnDefinition = "varchar(36)", updatable = false, nullable = false) private UUID id; private String firstName; @@ -43,4 +40,5 @@ public void setLastName(String lastName) { this.lastName = lastName; } + } diff --git a/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java index de0dc01b..1497bd09 100644 --- a/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java +++ b/src/main/java/guru/springframework/sdjpaintro/domain/BookUuid.java @@ -1,24 +1,22 @@ package guru.springframework.sdjpaintro.domain; +import jakarta.persistence.*; import org.hibernate.annotations.GenericGenerator; -import jakarta.persistence.*; import java.util.UUID; -/** - * Created by jt on 8/15/21. - */ @Entity public class BookUuid { @Id @GeneratedValue(generator = "uuid2") - @GenericGenerator(name = "uuid2", strategy = "uuid2") + @GenericGenerator(name = "uuid2", strategy = "uuid2") //This is how to specify UUID RFC 4122 Primary Key @Column(columnDefinition = "BINARY(16)", updatable = false, nullable = false) private UUID id; private String title; private String isbn; private String publisher; + private Long authorId; public UUID getId() { return id; @@ -52,4 +50,11 @@ public void setPublisher(String publisher) { this.publisher = publisher; } + public Long getAuthorId() { + return authorId; + } + + public void setAuthorId(Long authorId) { + this.authorId = authorId; + } } diff --git a/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java b/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java index ca7bb65c..5322eea3 100644 --- a/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java +++ b/src/main/java/guru/springframework/sdjpaintro/repositories/AuthorUuidRepository.java @@ -3,10 +3,8 @@ import guru.springframework.sdjpaintro.domain.AuthorUuid; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - /** - * Created by jt on 8/15/21. + * Created by EI on 29/08/22. */ -public interface AuthorUuidRepository extends JpaRepository { +public interface AuthorUuidRepository extends JpaRepository { } diff --git a/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java b/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java index dfb53d23..24ecfe47 100644 --- a/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java +++ b/src/main/java/guru/springframework/sdjpaintro/repositories/BookUuidRepository.java @@ -1,12 +1,11 @@ package guru.springframework.sdjpaintro.repositories; +import guru.springframework.sdjpaintro.domain.AuthorUuid; import guru.springframework.sdjpaintro.domain.BookUuid; import org.springframework.data.jpa.repository.JpaRepository; -import java.util.UUID; - /** - * Created by jt on 8/15/21. + * Created by EI on 29/08/22. */ -public interface BookUuidRepository extends JpaRepository { +public interface BookUuidRepository extends JpaRepository { } diff --git a/src/main/resources/db/migration/common/V5__author_uuid.sql b/src/main/resources/db/migration/common/V5__autoincrement_pk.sql similarity index 71% rename from src/main/resources/db/migration/common/V5__author_uuid.sql rename to src/main/resources/db/migration/common/V5__autoincrement_pk.sql index 16d2df8c..44bc3715 100644 --- a/src/main/resources/db/migration/common/V5__author_uuid.sql +++ b/src/main/resources/db/migration/common/V5__autoincrement_pk.sql @@ -2,6 +2,6 @@ create table author_uuid ( id varchar(36) not null, first_name varchar(255), - last_name varchar(255), + last_name varchar(255), primary key (id) -) engine = InnoDB; \ No newline at end of file +) engine=InnoDB; \ No newline at end of file diff --git a/src/main/resources/db/migration/common/V6__autoincrement_pk.sql b/src/main/resources/db/migration/common/V6__autoincrement_pk.sql new file mode 100644 index 00000000..44100990 --- /dev/null +++ b/src/main/resources/db/migration/common/V6__autoincrement_pk.sql @@ -0,0 +1,8 @@ +create table book_uuid +( + id binary(16) not null, + isbn varchar(255), + publisher varchar(255), + title varchar(255), + primary key (id) +) engine = InnoDB; \ No newline at end of file diff --git a/src/main/resources/db/migration/common/V6__book_uuid.sql b/src/main/resources/db/migration/common/V6__book_uuid.sql deleted file mode 100644 index 2bf92659..00000000 --- a/src/main/resources/db/migration/common/V6__book_uuid.sql +++ /dev/null @@ -1,7 +0,0 @@ -create table book_uuid ( - id binary(16) not null, - isbn varchar(255), - publisher varchar(255), - title varchar(255), - primary key (id) -) engine=InnoDB; \ No newline at end of file