diff --git a/spring-exceptions/pom.xml b/spring-exceptions/pom.xml
index ab8272cb02..7a52560615 100644
--- a/spring-exceptions/pom.xml
+++ b/spring-exceptions/pom.xml
@@ -50,6 +50,11 @@
${mysql-connector-java.version}
runtime
+
+ org.apache.tomcat
+ tomcat-dbcp
+ ${tomcat-dbcp.version}
+
@@ -188,8 +193,9 @@
1.2
- 4.2.3.Final
+ 4.2.4.Final
5.1.26
+ 7.0.42
1.7.5
diff --git a/spring-exceptions/src/main/java/org/baeldung/ex/nosuchbeandefinitionexception/spring/Cause1ContextWithJavaConfig.java b/spring-exceptions/src/main/java/org/baeldung/ex/nosuchbeandefinitionexception/spring/Cause1ContextWithJavaConfig.java
index 5ba971baa9..2eedc0d241 100644
--- a/spring-exceptions/src/main/java/org/baeldung/ex/nosuchbeandefinitionexception/spring/Cause1ContextWithJavaConfig.java
+++ b/spring-exceptions/src/main/java/org/baeldung/ex/nosuchbeandefinitionexception/spring/Cause1ContextWithJavaConfig.java
@@ -1,10 +1,13 @@
package org.baeldung.ex.nosuchbeandefinitionexception.spring;
+import org.baeldung.persistence.spring.PersistenceConfig;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
@Configuration
@ComponentScan("org.baeldung.ex.nosuchbeandefinitionexception.cause1")
+@Import(PersistenceConfig.class)
public class Cause1ContextWithJavaConfig {
public Cause1ContextWithJavaConfig() {
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java b/spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractHibernateDao.java
similarity index 97%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractHibernateDao.java
index 65e57afcb3..cadb2ac061 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/AbstractHibernateDao.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractHibernateDao.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao.common;
+package org.baeldung.persistence.common;
import java.io.Serializable;
import java.util.List;
diff --git a/spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractService.java b/spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractService.java
new file mode 100644
index 0000000000..d2e162ad7b
--- /dev/null
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/common/AbstractService.java
@@ -0,0 +1,44 @@
+package org.baeldung.persistence.common;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.baeldung.persistence.common.IOperations;
+import org.springframework.transaction.annotation.Transactional;
+
+@Transactional
+public abstract class AbstractService implements IOperations {
+
+ @Override
+ public T findOne(final long id) {
+ return getDao().findOne(id);
+ }
+
+ @Override
+ public List findAll() {
+ return getDao().findAll();
+ }
+
+ @Override
+ public void create(final T entity) {
+ getDao().create(entity);
+ }
+
+ @Override
+ public T update(final T entity) {
+ return getDao().update(entity);
+ }
+
+ @Override
+ public void delete(final T entity) {
+ getDao().delete(entity);
+ }
+
+ @Override
+ public void deleteById(final long entityId) {
+ getDao().deleteById(entityId);
+ }
+
+ protected abstract IOperations getDao();
+
+}
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java b/spring-exceptions/src/main/java/org/baeldung/persistence/common/IOperations.java
similarity index 87%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/common/IOperations.java
index 1c84b06c85..dee27950c7 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/common/IOperations.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/common/IOperations.java
@@ -1,4 +1,4 @@
-package org.baeldung.persistence.dao.common;
+package org.baeldung.persistence.common;
import java.io.Serializable;
import java.util.List;
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/IChildDao.java
similarity index 72%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/dao/IChildDao.java
index 3bc0dc1fc4..25290554f3 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IChildDao.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/IChildDao.java
@@ -1,6 +1,6 @@
package org.baeldung.persistence.dao;
-import org.baeldung.persistence.dao.common.IOperations;
+import org.baeldung.persistence.common.IOperations;
import org.baeldung.persistence.model.Child;
public interface IChildDao extends IOperations {
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/IParentDao.java
similarity index 73%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/dao/IParentDao.java
index 09158a4143..a047d97ef1 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/IParentDao.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/IParentDao.java
@@ -1,6 +1,6 @@
package org.baeldung.persistence.dao;
-import org.baeldung.persistence.dao.common.IOperations;
+import org.baeldung.persistence.common.IOperations;
import org.baeldung.persistence.model.Parent;
public interface IParentDao extends IOperations {
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ChildDao.java
similarity index 89%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ChildDao.java
index d9c8fdceec..e068573c5c 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ChildDao.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ChildDao.java
@@ -1,7 +1,7 @@
package org.baeldung.persistence.dao.impl;
+import org.baeldung.persistence.common.AbstractHibernateDao;
import org.baeldung.persistence.dao.IChildDao;
-import org.baeldung.persistence.dao.common.AbstractHibernateDao;
import org.baeldung.persistence.model.Child;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ParentDao.java
similarity index 89%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ParentDao.java
index 003ec62741..5634137b63 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/dao/impl/ParentDao.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/dao/impl/ParentDao.java
@@ -1,7 +1,7 @@
package org.baeldung.persistence.dao.impl;
+import org.baeldung.persistence.common.AbstractHibernateDao;
import org.baeldung.persistence.dao.IParentDao;
-import org.baeldung.persistence.dao.common.AbstractHibernateDao;
import org.baeldung.persistence.model.Parent;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/model/Child.java b/spring-exceptions/src/main/java/org/baeldung/persistence/model/Child.java
similarity index 100%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/model/Child.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/model/Child.java
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/model/Parent.java b/spring-exceptions/src/main/java/org/baeldung/persistence/model/Parent.java
similarity index 100%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/model/Parent.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/model/Parent.java
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java b/spring-exceptions/src/main/java/org/baeldung/persistence/service/IChildService.java
similarity index 73%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/service/IChildService.java
index c6c5e2cfb1..e2c2055ca2 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IChildService.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/service/IChildService.java
@@ -1,6 +1,6 @@
package org.baeldung.persistence.service;
-import org.baeldung.persistence.dao.common.IOperations;
+import org.baeldung.persistence.common.IOperations;
import org.baeldung.persistence.model.Child;
public interface IChildService extends IOperations {
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java b/spring-exceptions/src/main/java/org/baeldung/persistence/service/IParentService.java
similarity index 74%
rename from spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java
rename to spring-exceptions/src/main/java/org/baeldung/persistence/service/IParentService.java
index 1782c281d2..a05f07658f 100644
--- a/spring-exceptions/src/test/java/org/baeldung/persistence/service/IParentService.java
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/service/IParentService.java
@@ -1,6 +1,6 @@
package org.baeldung.persistence.service;
-import org.baeldung.persistence.dao.common.IOperations;
+import org.baeldung.persistence.common.IOperations;
import org.baeldung.persistence.model.Parent;
public interface IParentService extends IOperations {
diff --git a/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ChildService.java b/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ChildService.java
new file mode 100644
index 0000000000..4b66f3d2bd
--- /dev/null
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ChildService.java
@@ -0,0 +1,29 @@
+package org.baeldung.persistence.service.impl;
+
+import org.baeldung.persistence.common.AbstractService;
+import org.baeldung.persistence.common.IOperations;
+import org.baeldung.persistence.dao.IChildDao;
+import org.baeldung.persistence.model.Child;
+import org.baeldung.persistence.service.IChildService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class ChildService extends AbstractService implements IChildService {
+
+ @Autowired
+ private IChildDao dao;
+
+ public ChildService() {
+ super();
+ }
+
+ // API
+
+ @Override
+ protected IOperations getDao() {
+ return dao;
+ }
+
+}
diff --git a/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ParentService.java b/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ParentService.java
new file mode 100644
index 0000000000..97c44f4a2f
--- /dev/null
+++ b/spring-exceptions/src/main/java/org/baeldung/persistence/service/impl/ParentService.java
@@ -0,0 +1,28 @@
+package org.baeldung.persistence.service.impl;
+
+import org.baeldung.persistence.common.AbstractService;
+import org.baeldung.persistence.common.IOperations;
+import org.baeldung.persistence.dao.IParentDao;
+import org.baeldung.persistence.model.Parent;
+import org.baeldung.persistence.service.IParentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class ParentService extends AbstractService implements IParentService {
+
+ @Autowired
+ private IParentDao dao;
+
+ public ParentService() {
+ super();
+ }
+
+ // API
+
+ @Override
+ protected IOperations getDao() {
+ return dao;
+ }
+
+}
diff --git a/spring-exceptions/src/main/resources/persistence-mysql.properties b/spring-exceptions/src/main/resources/persistence-mysql.properties
new file mode 100644
index 0000000000..04a62f6c6a
--- /dev/null
+++ b/spring-exceptions/src/main/resources/persistence-mysql.properties
@@ -0,0 +1,10 @@
+# jdbc.X
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://localhost:3306/spring_hibernate4_exceptions?createDatabaseIfNotExist=true
+jdbc.user=tutorialuser
+jdbc.pass=tutorialmy5ql
+
+# hibernate.X
+hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
+hibernate.show_sql=false
+hibernate.hbm2ddl.auto=create-drop
diff --git a/spring-exceptions/src/test/java/org/baeldung/persistence/spring/PersistenceConfig.java b/spring-exceptions/src/test/java/org/baeldung/persistence/spring/PersistenceConfig.java
new file mode 100644
index 0000000000..cace2e1952
--- /dev/null
+++ b/spring-exceptions/src/test/java/org/baeldung/persistence/spring/PersistenceConfig.java
@@ -0,0 +1,79 @@
+package org.baeldung.persistence.spring;
+
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.apache.tomcat.dbcp.dbcp.BasicDataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
+import org.springframework.orm.hibernate4.HibernateTransactionManager;
+import org.springframework.orm.hibernate4.LocalSessionFactoryBean;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import com.google.common.base.Preconditions;
+
+@Configuration
+@EnableTransactionManagement
+@PropertySource({ "classpath:persistence-mysql.properties" })
+@ComponentScan({ "org.baeldung.persistence" })
+public class PersistenceConfig {
+
+ @Autowired
+ private Environment env;
+
+ public PersistenceConfig() {
+ super();
+ }
+
+ @Bean
+ public LocalSessionFactoryBean sessionFactory() {
+ final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
+ sessionFactory.setDataSource(restDataSource());
+ sessionFactory.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });
+ sessionFactory.setHibernateProperties(hibernateProperties());
+
+ return sessionFactory;
+ }
+
+ @Bean
+ public DataSource restDataSource() {
+ final BasicDataSource dataSource = new BasicDataSource();
+ dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
+ dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
+ dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
+ dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
+
+ return dataSource;
+ }
+
+ @Bean
+ public HibernateTransactionManager transactionManager() {
+ final HibernateTransactionManager txManager = new HibernateTransactionManager();
+ txManager.setSessionFactory(sessionFactory().getObject());
+
+ return txManager;
+ }
+
+ @Bean
+ public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
+ return new PersistenceExceptionTranslationPostProcessor();
+ }
+
+ final Properties hibernateProperties() {
+ return new Properties() {
+ {
+ setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
+ setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
+
+ // setProperty("hibernate.globally_quoted_identifiers", "true");
+ // note: necessary in launchpad-storage, but causing problems here
+ }
+ };
+ }
+}
\ No newline at end of file
diff --git a/spring-hibernate4/pom.xml b/spring-hibernate4/pom.xml
index 775abd7bda..e445098b1c 100644
--- a/spring-hibernate4/pom.xml
+++ b/spring-hibernate4/pom.xml
@@ -171,9 +171,9 @@
3.18.0-GA
- 4.2.3.Final
+ 4.2.4.Final
5.1.26
- 7.0.41
+ 7.0.42
1.7.5