diff --git a/spring-all/pom.xml b/spring-all/pom.xml
index 9561c1316e..bcbd87440c 100644
--- a/spring-all/pom.xml
+++ b/spring-all/pom.xml
@@ -21,6 +21,43 @@
spring-webmvc
${org.springframework.version}
+
+ org.springframework
+ spring-orm
+ ${org.springframework.version}
+
+
+ org.springframework
+ spring-context
+ ${org.springframework.version}
+
+
+
+
+
+ org.hibernate
+ hibernate-core
+ 4.2.1.Final
+
+
+ org.javassist
+ javassist
+ 3.17.1-GA
+
+
+ mysql
+ mysql-connector-java
+ 5.1.25
+ runtime
+
+
+
+
+
+ org.hibernate
+ hibernate-validator
+ 5.0.1.Final
+
@@ -38,6 +75,14 @@
runtime
+
+
+
+ com.google.guava
+ guava
+ 14.0.1
+
+
diff --git a/spring-all/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java b/spring-all/src/main/java/org/baeldung/spring/config/ClientWebConfig.java
similarity index 96%
rename from spring-all/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java
rename to spring-all/src/main/java/org/baeldung/spring/config/ClientWebConfig.java
index 945c1794fb..f027eb73fc 100644
--- a/spring-all/src/main/java/org/baeldung/spring/web/config/ClientWebConfig.java
+++ b/spring-all/src/main/java/org/baeldung/spring/config/ClientWebConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.web.config;
+package org.baeldung.spring.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-all/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java b/spring-all/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java
similarity index 97%
rename from spring-all/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java
rename to spring-all/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java
index 81a94f1a8c..32096c64c7 100644
--- a/spring-all/src/main/java/org/baeldung/spring/web/config/MainWebAppInitializer.java
+++ b/spring-all/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.web.config;
+package org.baeldung.spring.config;
import java.util.Set;
diff --git a/spring-all/src/main/java/org/baeldung/spring/config/PersistenceConfig.java b/spring-all/src/main/java/org/baeldung/spring/config/PersistenceConfig.java
new file mode 100644
index 0000000000..078d7e6f88
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/spring/config/PersistenceConfig.java
@@ -0,0 +1,79 @@
+package org.baeldung.spring.config;
+
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+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.jdbc.datasource.DriverManagerDataSource;
+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.spring.persistence.dao", "org.baeldung.spring.persistence.service" })
+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.spring.persistence.model" });
+ sessionFactory.setHibernateProperties(hibernateProperties());
+
+ return sessionFactory;
+ }
+
+ @Bean
+ public DataSource restDataSource() {
+ final DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ 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-all/src/main/java/org/baeldung/spring/web/config/WebConfig.java b/spring-all/src/main/java/org/baeldung/spring/config/WebConfig.java
similarity index 91%
rename from spring-all/src/main/java/org/baeldung/spring/web/config/WebConfig.java
rename to spring-all/src/main/java/org/baeldung/spring/config/WebConfig.java
index d60bcfe127..640302a495 100644
--- a/spring-all/src/main/java/org/baeldung/spring/web/config/WebConfig.java
+++ b/spring-all/src/main/java/org/baeldung/spring/config/WebConfig.java
@@ -1,4 +1,4 @@
-package org.baeldung.spring.web.config;
+package org.baeldung.spring.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-all/src/main/java/org/baeldung/web/BeanA.java b/spring-all/src/main/java/org/baeldung/web/BeanA.java
index b6b6f49c16..7a8a0d24d8 100644
--- a/spring-all/src/main/java/org/baeldung/web/BeanA.java
+++ b/spring-all/src/main/java/org/baeldung/web/BeanA.java
@@ -7,7 +7,7 @@ import org.springframework.stereotype.Component;
public class BeanA {
@Autowired
- private BeanB b;
+ private IBeanB b;
public BeanA() {
super();
diff --git a/spring-all/src/main/java/org/baeldung/web/BeanB.java b/spring-all/src/main/java/org/baeldung/web/BeanB.java
index 49e5af4ccb..4078fe7000 100644
--- a/spring-all/src/main/java/org/baeldung/web/BeanB.java
+++ b/spring-all/src/main/java/org/baeldung/web/BeanB.java
@@ -1,9 +1,11 @@
package org.baeldung.web;
import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
@Component
-public class BeanB {
+@Transactional
+public class BeanB implements IBeanB {
public BeanB() {
super();
diff --git a/spring-all/src/main/java/org/baeldung/web/IBeanB.java b/spring-all/src/main/java/org/baeldung/web/IBeanB.java
new file mode 100644
index 0000000000..63357980ad
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/web/IBeanB.java
@@ -0,0 +1,5 @@
+package org.baeldung.web;
+
+public interface IBeanB {
+ //
+}