Skip to content

Commit cfa5f07

Browse files
Alejandro GervasioKevinGilmore
authored andcommitted
The DAO Pattern in Java (eugenp#4372)
* Initial Commit * Rename persistence.xml file * Update JpaEntityManagerFactory.java * Update pom.xml * Update JpaEntityManagerFactory.java * Update JpaEntityManagerFactory.java * Update pom.xml * Update persistence.xml
1 parent f898fe9 commit cfa5f07

File tree

5 files changed

+214
-18
lines changed

5 files changed

+214
-18
lines changed

patterns/design-patterns/pom.xml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,18 @@
5050
<dependency>
5151
<groupId>mysql</groupId>
5252
<artifactId>mysql-connector-java</artifactId>
53-
<version>8.0.11</version>
54-
<scope>test</scope>
55-
</dependency>
56-
<dependency>
53+
<version>6.0.6</version>
54+
<type>jar</type>
55+
</dependency>
56+
<dependency>
5757
<groupId>log4j</groupId>
5858
<artifactId>log4j</artifactId>
5959
<version>${log4j.version}</version>
60-
</dependency>
61-
<dependency>
62-
<groupId>com.googlecode.grep4j</groupId>
63-
<artifactId>grep4j</artifactId>
64-
<version>${grep4j.version}</version>
60+
</dependency>
61+
<dependency>
62+
<groupId>com.googlecode.grep4j</groupId>
63+
<artifactId>grep4j</artifactId>
64+
<version>${grep4j.version}</version>
6565
</dependency>
6666
</dependencies>
6767
<properties>

patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.baeldung.daopattern.application;
22

3+
import com.baeldung.daopattern.config.JpaEntityManagerFactory;
34
import com.baeldung.daopattern.daos.Dao;
45
import com.baeldung.daopattern.daos.JpaUserDao;
56
import com.baeldung.daopattern.entities.User;
@@ -21,17 +22,17 @@ public static void main(String[] args) {
2122
getAllUsers().forEach(user -> System.out.println(user.getName()));
2223
}
2324

25+
private static class JpaUserDaoHolder {
26+
private static final JpaUserDao jpaUserDao = new JpaUserDao(new JpaEntityManagerFactory().getEntityManager());
27+
}
28+
2429
public static Dao getJpaUserDao() {
25-
if (jpaUserDao == null) {
26-
EntityManager entityManager = Persistence.createEntityManagerFactory("user-unit").createEntityManager();
27-
jpaUserDao = new JpaUserDao(entityManager);
28-
}
29-
return jpaUserDao;
30+
return JpaUserDaoHolder.jpaUserDao;
3031
}
3132

3233
public static User getUser(long id) {
3334
Optional<User> user = getJpaUserDao().get(id);
34-
return user.orElse(new User("Non-existing user", "no-email"));
35+
return user.orElseGet(()-> {return new User("non-existing user", "no-email");});
3536
}
3637

3738
public static List<User> getAllUsers() {
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.baeldung.daopattern.config;
2+
3+
import com.baeldung.daopattern.entities.User;
4+
import com.mysql.cj.jdbc.MysqlDataSource;
5+
import java.util.Arrays;
6+
import java.util.HashMap;
7+
import java.util.List;
8+
import java.util.Map;
9+
import java.util.Properties;
10+
import java.util.stream.Collectors;
11+
import javax.persistence.EntityManager;
12+
import javax.sql.DataSource;
13+
import javax.persistence.EntityManagerFactory;
14+
import javax.persistence.spi.PersistenceUnitInfo;
15+
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
16+
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
17+
18+
public class JpaEntityManagerFactory {
19+
20+
private final String DB_URL = "jdbc:mysql://databaseurl";
21+
private final String DB_USER_NAME = "username";
22+
private final String DB_PASSWORD = "password";
23+
24+
public EntityManager getEntityManager() {
25+
return getEntityManagerFactory().createEntityManager();
26+
}
27+
28+
protected EntityManagerFactory getEntityManagerFactory() {
29+
PersistenceUnitInfo persistenceUnitInfo = getPersistenceUnitInfo(getClass().getSimpleName());
30+
Map<String, Object> configuration = new HashMap<>();
31+
return new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo), configuration)
32+
.build();
33+
}
34+
35+
protected PersistenceUnitInfoImpl getPersistenceUnitInfo(String name) {
36+
return new PersistenceUnitInfoImpl(name, getEntityClassNames(), getProperties());
37+
}
38+
39+
protected List<String> getEntityClassNames() {
40+
return Arrays.asList(getEntities())
41+
.stream()
42+
.map(Class::getName)
43+
.collect(Collectors.toList());
44+
}
45+
46+
protected Properties getProperties() {
47+
Properties properties = new Properties();
48+
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
49+
properties.put("hibernate.id.new_generator_mappings", false);
50+
properties.put("hibernate.connection.datasource", getMysqlDataSource());
51+
return properties;
52+
}
53+
54+
protected Class[] getEntities() {
55+
return new Class[]{User.class};
56+
}
57+
58+
protected DataSource getMysqlDataSource() {
59+
MysqlDataSource mysqlDataSource = new MysqlDataSource();
60+
mysqlDataSource.setURL(DB_URL);
61+
mysqlDataSource.setUser(DB_USER_NAME);
62+
mysqlDataSource.setPassword(DB_PASSWORD);
63+
return mysqlDataSource;
64+
}
65+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package com.baeldung.daopattern.config;
2+
3+
import java.net.URL;
4+
import java.util.ArrayList;
5+
import java.util.Collections;
6+
import java.util.List;
7+
import java.util.Properties;
8+
import javax.sql.DataSource;
9+
import javax.persistence.SharedCacheMode;
10+
import javax.persistence.ValidationMode;
11+
import javax.persistence.spi.ClassTransformer;
12+
import javax.persistence.spi.PersistenceUnitInfo;
13+
import javax.persistence.spi.PersistenceUnitTransactionType;
14+
import org.hibernate.jpa.HibernatePersistenceProvider;
15+
16+
public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
17+
18+
public static final String JPA_VERSION = "2.1";
19+
private final String persistenceUnitName;
20+
private PersistenceUnitTransactionType transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
21+
private final List<String> managedClassNames;
22+
private final List<String> mappingFileNames = new ArrayList<>();
23+
private final Properties properties;
24+
private DataSource jtaDataSource;
25+
private DataSource nonJtaDataSource;
26+
27+
public PersistenceUnitInfoImpl(String persistenceUnitName, List<String> managedClassNames, Properties properties) {
28+
this.persistenceUnitName = persistenceUnitName;
29+
this.managedClassNames = managedClassNames;
30+
this.properties = properties;
31+
}
32+
33+
@Override
34+
public String getPersistenceUnitName() {
35+
return persistenceUnitName;
36+
}
37+
38+
@Override
39+
public String getPersistenceProviderClassName() {
40+
return HibernatePersistenceProvider.class.getName();
41+
}
42+
43+
@Override
44+
public PersistenceUnitTransactionType getTransactionType() {
45+
return transactionType;
46+
}
47+
48+
@Override
49+
public DataSource getJtaDataSource() {
50+
return jtaDataSource;
51+
}
52+
53+
public PersistenceUnitInfoImpl setJtaDataSource(DataSource jtaDataSource) {
54+
this.jtaDataSource = jtaDataSource;
55+
this.nonJtaDataSource = null;
56+
transactionType = PersistenceUnitTransactionType.JTA;
57+
return this;
58+
}
59+
60+
@Override
61+
public DataSource getNonJtaDataSource() {
62+
return nonJtaDataSource;
63+
}
64+
65+
public PersistenceUnitInfoImpl setNonJtaDataSource(DataSource nonJtaDataSource) {
66+
this.nonJtaDataSource = nonJtaDataSource;
67+
this.jtaDataSource = null;
68+
transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
69+
return this;
70+
}
71+
72+
@Override
73+
public List<String> getMappingFileNames() {
74+
return mappingFileNames;
75+
}
76+
77+
@Override
78+
public List<URL> getJarFileUrls() {
79+
return Collections.emptyList();
80+
}
81+
82+
@Override
83+
public URL getPersistenceUnitRootUrl() {
84+
return null;
85+
}
86+
87+
@Override
88+
public List<String> getManagedClassNames() {
89+
return managedClassNames;
90+
}
91+
92+
@Override
93+
public boolean excludeUnlistedClasses() {
94+
return false;
95+
}
96+
97+
@Override
98+
public SharedCacheMode getSharedCacheMode() {
99+
return SharedCacheMode.UNSPECIFIED;
100+
}
101+
102+
@Override
103+
public ValidationMode getValidationMode() {
104+
return ValidationMode.AUTO;
105+
}
106+
107+
public Properties getProperties() {
108+
return properties;
109+
}
110+
111+
@Override
112+
public String getPersistenceXMLSchemaVersion() {
113+
return JPA_VERSION;
114+
}
115+
116+
@Override
117+
public ClassLoader getClassLoader() {
118+
return Thread.currentThread().getContextClassLoader();
119+
}
120+
121+
@Override
122+
public void addTransformer(ClassTransformer transformer) {
123+
throw new UnsupportedOperationException("Not supported yet.");
124+
}
125+
126+
@Override
127+
public ClassLoader getNewTempClassLoader() {
128+
return null;
129+
}
130+
}

patterns/design-patterns/src/main/resources/META-INF/persistence.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
33
<persistence-unit name="user-unit">
44
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
5-
<class>com.baeldung.daopattern.entities.User</class>
5+
<class>com.baeldung.pattern.daopattern.entities.User</class>
66
<properties>
77
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
8-
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://url/to/database"/>
8+
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://databaseurl"/>
99
<property name="javax.persistence.jdbc.user" value="username"/>
10-
<property name="javax.persistence.jdbc.password" value="passsword"/>
10+
<property name="javax.persistence.jdbc.password" value="password"/>
1111
<!-- Hibernate Properties -->
1212
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
1313
<property name="hibernate.show_sql" value="true"/>

0 commit comments

Comments
 (0)