diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index ec7f0bcec2..78da896861 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -61,6 +61,7 @@
spring-data-jpa-2
spring-data-jpa-3
spring-data-jpa-4
+ spring-data-jpa-5
spring-data-keyvalue
spring-data-mongodb
spring-data-neo4j
diff --git a/persistence-modules/spring-data-jpa-5/README.md b/persistence-modules/spring-data-jpa-5/README.md
index dd4ac22e4a..e8f83654df 100644
--- a/persistence-modules/spring-data-jpa-5/README.md
+++ b/persistence-modules/spring-data-jpa-5/README.md
@@ -1,4 +1,5 @@
### Relevant Articles:
+
- [Spring JPA @Embedded and @EmbeddedId](TBD)
### Eclipse Config
@@ -9,3 +10,4 @@ This can be ignored:
- Project -> Properties -> Java Persistance -> JPA -> Error/Warnings -> Select Ignore on "No persistence xml file found in project"
Or:
- Eclipse -> Preferences - Validation - disable the "Build" execution of the JPA Validator
+
diff --git a/persistence-modules/spring-data-jpa-5/pom.xml b/persistence-modules/spring-data-jpa-5/pom.xml
index 7f2c724f98..3053384559 100644
--- a/persistence-modules/spring-data-jpa-5/pom.xml
+++ b/persistence-modules/spring-data-jpa-5/pom.xml
@@ -33,5 +33,5 @@
h2
-
+
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java
new file mode 100644
index 0000000000..547992a6c1
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/AccountApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.schemageneration;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class AccountApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(AccountApplication.class, args);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java
new file mode 100644
index 0000000000..7d69d65705
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/HibernateUtil.java
@@ -0,0 +1,39 @@
+package com.baeldung.schemageneration;
+
+import com.baeldung.schemageneration.model.Account;
+import com.baeldung.schemageneration.model.AccountSetting;
+import org.hibernate.boot.Metadata;
+import org.hibernate.boot.MetadataSources;
+import org.hibernate.boot.registry.StandardServiceRegistry;
+import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
+import org.hibernate.cfg.Environment;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+import org.hibernate.tool.schema.TargetType;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HibernateUtil {
+
+ /**
+ * Generates database create commands for the specified entities using Hibernate native API, SchemaExport.
+ * Creation commands are exported into the create.sql file.
+ */
+ public static void generateSchema() {
+ Map settings = new HashMap<>();
+ settings.put(Environment.URL, "jdbc:h2:mem:schema");
+
+ StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build();
+
+ MetadataSources metadataSources = new MetadataSources(serviceRegistry);
+ metadataSources.addAnnotatedClass(Account.class);
+ metadataSources.addAnnotatedClass(AccountSetting.class);
+ Metadata metadata = metadataSources.buildMetadata();
+
+ SchemaExport schemaExport = new SchemaExport();
+ schemaExport.setFormat(true);
+ schemaExport.setOutputFile("create.sql");
+ schemaExport.createOnly(EnumSet.of(TargetType.SCRIPT), metadata);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java
new file mode 100644
index 0000000000..785e275e26
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/Account.java
@@ -0,0 +1,74 @@
+package com.baeldung.schemageneration.model;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import java.util.ArrayList;
+import java.util.List;
+
+@Entity
+@Table(name = "accounts")
+public class Account {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Column(nullable = false, length = 100)
+ private String name;
+
+ @Column(name = "email_address")
+ private String emailAddress;
+
+ @OneToMany(mappedBy = "account", cascade = CascadeType.ALL)
+ private List accountSettings = new ArrayList<>();
+
+ public Account() {
+ }
+
+ public Account(String name, String emailAddress) {
+ this.name = name;
+ this.emailAddress = emailAddress;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+ public List getAccountSettings() {
+ return accountSettings;
+ }
+
+ public void setAccountSettings(List accountSettings) {
+ this.accountSettings = accountSettings;
+ }
+
+ public void addAccountSetting(AccountSetting setting) {
+ this.accountSettings.add(setting);
+ setting.setAccount(this);
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java
new file mode 100644
index 0000000000..61e43894a8
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/model/AccountSetting.java
@@ -0,0 +1,68 @@
+package com.baeldung.schemageneration.model;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "account_settings")
+public class AccountSetting {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Column(name = "name", nullable = false)
+ private String settingName;
+
+ @Column(name = "value", nullable = false)
+ private String settingValue;
+
+ @ManyToOne()
+ @JoinColumn(name ="account_id", nullable = false)
+ private Account account;
+
+ public AccountSetting() {
+ }
+
+ public AccountSetting(String settingName, String settingValue) {
+ this.settingName = settingName;
+ this.settingValue = settingValue;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getSettingName() {
+ return settingName;
+ }
+
+ public void setSettingName(String settingName) {
+ this.settingName = settingName;
+ }
+
+ public String getSettingValue() {
+ return settingValue;
+ }
+
+ public void setSettingValue(String settingValue) {
+ this.settingValue = settingValue;
+ }
+
+ public Account getAccount() {
+ return account;
+ }
+
+ public void setAccount(Account account) {
+ this.account = account;
+ }
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java
new file mode 100644
index 0000000000..dc57ffe6d3
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.schemageneration.repository;
+
+import com.baeldung.schemageneration.model.Account;
+import org.springframework.data.repository.CrudRepository;
+
+public interface AccountRepository extends CrudRepository {
+ Account findByName(String name);
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java
new file mode 100644
index 0000000000..c2b8ff7398
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/main/java/com/baeldung/schemageneration/repository/AccountSettingRepository.java
@@ -0,0 +1,8 @@
+package com.baeldung.schemageneration.repository;
+
+import com.baeldung.schemageneration.model.AccountSetting;
+import org.springframework.data.repository.CrudRepository;
+
+public interface AccountSettingRepository extends CrudRepository {
+ AccountSetting findByAccountId(Long accountId);
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
index dfc5e56e33..f55ad438ff 100644
--- a/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
+++ b/persistence-modules/spring-data-jpa-5/src/main/resources/application.properties
@@ -1,2 +1,13 @@
+
+spring.datasource.url=jdbc:h2:mem:baeldung
+
+# JPA-Schema-Generation
+# Use below configuration to generate database schema create commands based on the entity models
+# and export them into the create.sql file
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-source=metadata
+#spring.jpa.properties.hibernate.format_sql=true
+
spring.jpa.show-sql=true
diff --git a/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..86a7671fe4
--- /dev/null
+++ b/persistence-modules/spring-data-jpa-5/src/test/java/com/baeldung/schemageneration/AccountRepositoryIntegrationTest.java
@@ -0,0 +1,72 @@
+package com.baeldung.schemageneration;
+
+import com.baeldung.schemageneration.model.Account;
+import com.baeldung.schemageneration.model.AccountSetting;
+import com.baeldung.schemageneration.repository.AccountRepository;
+import com.baeldung.schemageneration.repository.AccountSettingRepository;
+import org.junit.After;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = AccountApplication.class)
+public class AccountRepositoryIntegrationTest {
+
+ private static final String USER_NAME = "Eduard";
+ private static final String USER_EMAIL_ADDRESS = "eduard@gmx.com";
+ private static final String ACCOUNT_SETTING_NAME = "Timezone";
+ private static final String ACCOUNT_SETTING_VALUE = "UTC+02";
+
+ @Autowired
+ private AccountRepository accountRepository;
+
+ @Autowired
+ private AccountSettingRepository accountSettingRepository;
+
+ @After
+ public void tearDown() {
+ accountRepository.deleteAll();
+ }
+
+ @Test
+ public void givenNewAccount_whenSave_thenSuccess() {
+ Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+ accountRepository.save(account);
+
+ assertEquals(1, accountRepository.count());
+ }
+
+ @Test
+ public void givenSavedAccount_whenFindByName_thenFound() {
+ Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+ accountRepository.save(account);
+
+ Account accountFound = accountRepository.findByName(USER_NAME);
+
+ assertNotNull(accountFound);
+ assertEquals(USER_NAME, accountFound.getName());
+ assertEquals(USER_EMAIL_ADDRESS, accountFound.getEmailAddress());
+ }
+
+ @Test
+ public void givenSavedAccount_whenAccountSettingIsAdded_thenPersisted() {
+ Account account = new Account(USER_NAME, USER_EMAIL_ADDRESS);
+ account.addAccountSetting(new AccountSetting(ACCOUNT_SETTING_NAME, ACCOUNT_SETTING_VALUE));
+ accountRepository.save(account);
+
+ Account accountFound = accountRepository.findByName(USER_NAME);
+ assertNotNull(accountFound);
+ AccountSetting accountSetting = accountSettingRepository.findByAccountId(accountFound.getId());
+
+ assertNotNull(accountSetting);
+ assertEquals(ACCOUNT_SETTING_NAME, accountSetting.getSettingName());
+ assertEquals(ACCOUNT_SETTING_VALUE, accountSetting.getSettingValue());
+ }
+
+}
diff --git a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
index 207de2e8ec..e3d39fe1e2 100644
--- a/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
+++ b/persistence-modules/spring-data-jpa-5/src/test/resources/application-test.properties
@@ -1 +1,3 @@
spring.jpa.hibernate.ddl-auto=update
+spring.datasource.url=jdbc:h2:mem:baeldung
+