diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns/pom.xml
index abf449fc43..dd1c5abced 100644
--- a/patterns/design-patterns/pom.xml
+++ b/patterns/design-patterns/pom.xml
@@ -50,18 +50,18 @@
mysql
mysql-connector-java
- 8.0.11
- test
-
-
+ 6.0.6
+ jar
+
+
log4j
log4j
${log4j.version}
-
-
- com.googlecode.grep4j
- grep4j
- ${grep4j.version}
+
+
+ com.googlecode.grep4j
+ grep4j
+ ${grep4j.version}
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java
index 05155aafcd..3a5c049992 100644
--- a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java
+++ b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java
@@ -1,5 +1,6 @@
package com.baeldung.daopattern.application;
+import com.baeldung.daopattern.config.JpaEntityManagerFactory;
import com.baeldung.daopattern.daos.Dao;
import com.baeldung.daopattern.daos.JpaUserDao;
import com.baeldung.daopattern.entities.User;
@@ -21,17 +22,17 @@ public class UserApplication {
getAllUsers().forEach(user -> System.out.println(user.getName()));
}
+ private static class JpaUserDaoHolder {
+ private static final JpaUserDao jpaUserDao = new JpaUserDao(new JpaEntityManagerFactory().getEntityManager());
+ }
+
public static Dao getJpaUserDao() {
- if (jpaUserDao == null) {
- EntityManager entityManager = Persistence.createEntityManagerFactory("user-unit").createEntityManager();
- jpaUserDao = new JpaUserDao(entityManager);
- }
- return jpaUserDao;
+ return JpaUserDaoHolder.jpaUserDao;
}
public static User getUser(long id) {
Optional user = getJpaUserDao().get(id);
- return user.orElse(new User("Non-existing user", "no-email"));
+ return user.orElseGet(()-> {return new User("non-existing user", "no-email");});
}
public static List getAllUsers() {
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java
new file mode 100644
index 0000000000..11718d5612
--- /dev/null
+++ b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java
@@ -0,0 +1,65 @@
+package com.baeldung.daopattern.config;
+
+import com.baeldung.daopattern.entities.User;
+import com.mysql.cj.jdbc.MysqlDataSource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.stream.Collectors;
+import javax.persistence.EntityManager;
+import javax.sql.DataSource;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceUnitInfo;
+import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
+import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
+
+public class JpaEntityManagerFactory {
+
+ private final String DB_URL = "jdbc:mysql://databaseurl";
+ private final String DB_USER_NAME = "username";
+ private final String DB_PASSWORD = "password";
+
+ public EntityManager getEntityManager() {
+ return getEntityManagerFactory().createEntityManager();
+ }
+
+ protected EntityManagerFactory getEntityManagerFactory() {
+ PersistenceUnitInfo persistenceUnitInfo = getPersistenceUnitInfo(getClass().getSimpleName());
+ Map configuration = new HashMap<>();
+ return new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo), configuration)
+ .build();
+ }
+
+ protected PersistenceUnitInfoImpl getPersistenceUnitInfo(String name) {
+ return new PersistenceUnitInfoImpl(name, getEntityClassNames(), getProperties());
+ }
+
+ protected List getEntityClassNames() {
+ return Arrays.asList(getEntities())
+ .stream()
+ .map(Class::getName)
+ .collect(Collectors.toList());
+ }
+
+ protected Properties getProperties() {
+ Properties properties = new Properties();
+ properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
+ properties.put("hibernate.id.new_generator_mappings", false);
+ properties.put("hibernate.connection.datasource", getMysqlDataSource());
+ return properties;
+ }
+
+ protected Class[] getEntities() {
+ return new Class[]{User.class};
+ }
+
+ protected DataSource getMysqlDataSource() {
+ MysqlDataSource mysqlDataSource = new MysqlDataSource();
+ mysqlDataSource.setURL(DB_URL);
+ mysqlDataSource.setUser(DB_USER_NAME);
+ mysqlDataSource.setPassword(DB_PASSWORD);
+ return mysqlDataSource;
+ }
+}
diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java
new file mode 100644
index 0000000000..f3277da0cf
--- /dev/null
+++ b/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java
@@ -0,0 +1,130 @@
+package com.baeldung.daopattern.config;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Properties;
+import javax.sql.DataSource;
+import javax.persistence.SharedCacheMode;
+import javax.persistence.ValidationMode;
+import javax.persistence.spi.ClassTransformer;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import org.hibernate.jpa.HibernatePersistenceProvider;
+
+public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
+
+ public static final String JPA_VERSION = "2.1";
+ private final String persistenceUnitName;
+ private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ private final List managedClassNames;
+ private final List mappingFileNames = new ArrayList<>();
+ private final Properties properties;
+ private DataSource jtaDataSource;
+ private DataSource nonJtaDataSource;
+
+ public PersistenceUnitInfoImpl(String persistenceUnitName, List managedClassNames, Properties properties) {
+ this.persistenceUnitName = persistenceUnitName;
+ this.managedClassNames = managedClassNames;
+ this.properties = properties;
+ }
+
+ @Override
+ public String getPersistenceUnitName() {
+ return persistenceUnitName;
+ }
+
+ @Override
+ public String getPersistenceProviderClassName() {
+ return HibernatePersistenceProvider.class.getName();
+ }
+
+ @Override
+ public PersistenceUnitTransactionType getTransactionType() {
+ return transactionType;
+ }
+
+ @Override
+ public DataSource getJtaDataSource() {
+ return jtaDataSource;
+ }
+
+ public PersistenceUnitInfoImpl setJtaDataSource(DataSource jtaDataSource) {
+ this.jtaDataSource = jtaDataSource;
+ this.nonJtaDataSource = null;
+ transactionType = PersistenceUnitTransactionType.JTA;
+ return this;
+ }
+
+ @Override
+ public DataSource getNonJtaDataSource() {
+ return nonJtaDataSource;
+ }
+
+ public PersistenceUnitInfoImpl setNonJtaDataSource(DataSource nonJtaDataSource) {
+ this.nonJtaDataSource = nonJtaDataSource;
+ this.jtaDataSource = null;
+ transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ return this;
+ }
+
+ @Override
+ public List getMappingFileNames() {
+ return mappingFileNames;
+ }
+
+ @Override
+ public List getJarFileUrls() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public URL getPersistenceUnitRootUrl() {
+ return null;
+ }
+
+ @Override
+ public List getManagedClassNames() {
+ return managedClassNames;
+ }
+
+ @Override
+ public boolean excludeUnlistedClasses() {
+ return false;
+ }
+
+ @Override
+ public SharedCacheMode getSharedCacheMode() {
+ return SharedCacheMode.UNSPECIFIED;
+ }
+
+ @Override
+ public ValidationMode getValidationMode() {
+ return ValidationMode.AUTO;
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ @Override
+ public String getPersistenceXMLSchemaVersion() {
+ return JPA_VERSION;
+ }
+
+ @Override
+ public ClassLoader getClassLoader() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ @Override
+ public void addTransformer(ClassTransformer transformer) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public ClassLoader getNewTempClassLoader() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/patterns/design-patterns/src/main/resources/META-INF/persistence.xml b/patterns/design-patterns/src/main/resources/META-INF/persistence.xml
index 61a5c9effc..e67a25e467 100644
--- a/patterns/design-patterns/src/main/resources/META-INF/persistence.xml
+++ b/patterns/design-patterns/src/main/resources/META-INF/persistence.xml
@@ -2,12 +2,12 @@
org.hibernate.jpa.HibernatePersistenceProvider
- com.baeldung.daopattern.entities.User
+ com.baeldung.pattern.daopattern.entities.User
-
+
-
+