Spring MVC Hibernate integration examples

We will see Spring MVC Hibernate integration example using Java Configuration.

1) Create a maven web project in eclipse    

<groupid>com.bala</groupid> <artifactid>spring-mvc-hibernate-annotationbased</artifactid> <name>spring-mvc-hibernate-annotationbased</name> <version>1.0.0-BUILD-SNAPSHOT</version>

2). In pom.xml add the required dependencies like

Servlet JSP,MySQL etc.

<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>com.bala</groupid> <artifactid>spring-mvc-hibernate-annotationbased</artifactid> <name>spring-mvc-hibernate-annotationbased</name> <packaging>war</packaging> <version>1.0.0-BUILD-SNAPSHOT</version> <properties> <java-version>1.8</java-version> <org .springframework-version="">4.3.0.RELEASE</org> <org .aspectj-version="">1.6.10</org> <org .slf4j-version="">1.6.6</org> <springsecurity .version="">4.0.4.RELEASE</springsecurity> <hibernate .version="">4.3.11.Final</hibernate> <mysql .connector.version="">5.1.31</mysql> </properties> <dependencies> <!--Spring--> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-core</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-web</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-webmvc</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-tx</artifactid> <version>${org.springframework-version}</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-orm</artifactid> <version>${org.springframework-version}</version> </dependency> <!--AspectJ--> <dependency> <groupid>org.aspectj</groupid> <artifactid>aspectjrt</artifactid> <version>${org.aspectj-version}</version> </dependency> <!--Hibernate--> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-core</artifactid> <version>${hibernate.version}</version> </dependency> <!--jsr303 validation--> <dependency> <groupid>javax.validation</groupid> <artifactid>validation-api</artifactid> <version>1.1.0.Final</version> </dependency> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-validator</artifactid> <version>5.1.3.Final</version> </dependency> <!--MySQL--> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <version>${mysql.connector.version}</version> </dependency> <!--Logging--> <dependency> <groupid>org.slf4j</groupid> <artifactid>slf4j-api</artifactid> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupid>org.slf4j</groupid> <artifactid>jcl-over-slf4j</artifactid> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupid>org.slf4j</groupid> <artifactid>slf4j-log4j12</artifactid> <version>${org.slf4j-version}</version> <scope>runtime</scope> </dependency> <dependency> <groupid>log4j</groupid> <artifactid>log4j</artifactid> <version>1.2.15</version> <exclusions> <exclusion> <groupid>javax.mail</groupid> <artifactid>mail</artifactid> </exclusion> <exclusion> <groupid>javax.jms</groupid> <artifactid>jms</artifactid> </exclusion> <exclusion> <groupid>com.sun.jdmk</groupid> <artifactid>jmxtools</artifactid> </exclusion> <exclusion> <groupid>com.sun.jmx</groupid> <artifactid>jmxri</artifactid> </exclusion> </exclusions> <scope>runtime</scope> </dependency> <!--@Inject--> <dependency> <groupid>javax.inject</groupid> <artifactid>javax.inject</artifactid> <version>1</version> </dependency> <!--Spring Security--> <dependency> <groupid>org.springframework.security</groupid> <artifactid>spring-security-web</artifactid> <version>${springsecurity.version}</version> </dependency> <dependency> <groupid>org.springframework.security</groupid> <artifactid>spring-security-config</artifactid> <version>${springsecurity.version}</version> </dependency> <dependency> <groupid>org.springframework.security</groupid> <artifactid>spring-security-taglibs</artifactid> <version>${springsecurity.version}</version> </dependency> <!--Servlet+JSP+JSTL--> <dependency> <groupid>javax.servlet</groupid> <artifactid>javax.servlet-api</artifactid> <version>3.1.0</version> </dependency> <dependency> <groupid>javax.servlet.jsp</groupid> <artifactid>javax.servlet.jsp-api</artifactid> <version>2.3.1</version> </dependency> <dependency> <groupid>javax.servlet</groupid> <artifactid>jstl</artifactid> <version>1.2</version> </dependency> <!--Test--> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>4.7</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactid>maven-eclipse-plugin</artifactid> <version>2.10</version> <configuration> <additionalprojectnatures> <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> </additionalprojectnatures> <additionalbuildcommands> <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> </additionalbuildcommands> <downloadsources>true</downloadsources> <downloadjavadocs>true</downloadjavadocs> </configuration> </plugin> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-compiler-plugin</artifactid> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <showwarnings>true</showwarnings> <showdeprecation>true</showdeprecation> </configuration> </plugin> <plugin> <groupid>org.codehaus.mojo</groupid> <artifactid>exec-maven-plugin</artifactid> <version>1.6.0</version> <configuration> <mainclass>org.test.int1.Main</mainclass> </configuration> </plugin> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-war-plugin</artifactid> <version>2.4</version> <configuration> <warsourcedirectory>src/main/webapp</warsourcedirectory> <warname>springapp</warname> <failonmissingwebxml>false</failonmissingwebxml> </configuration> </plugin> </plugins> </build> </project>

Database

In MySQL command line or in workbench create a database using the command.
create database userdb;
 

For tables in the database, we have let hibernate create for us. As we give property hibernate.hbm2ddl.auto = create to hibernate so it will create a database for use.

We have property file where we mentioned database connection details

application.properties db.driver = com.mysql.jdbc.Driver db.url = jdbc:mysql://localhost/userdb?useSSL=false db.username = root db.password = root # Hibernate hibernate.dialect = org.hibernate.dialect.MySQL5Dialect hibernate.hbm2ddl.auto = create hibernate.show_sql = true entitymanager.packagesToScan = com.bala.spring.model

Configure JSP views and resources for web applications as below

package com.bala.spring.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.bala.spring") public class AppConfig extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setViewClass(JstlView.class); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry .addResourceHandler("/resources/**") .addResourceLocations("/resources/"); } }

Register Dispatcher Servlet for Spring application.

package com.bala.spring.config; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRegistration; import org.springframework.web.WebApplicationInitializer; import org.springframework.web.context.ContextLoaderListener; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; import org.springframework.web.servlet.DispatcherServlet; public class AppInitializer implements WebApplicationInitializer { public void onStartup(ServletContext container) throws ServletException { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); ctx.register(AppConfig.class); // Manage the lifecycle of the root application context container.addListener(new ContextLoaderListener(ctx)); ctx.setServletContext(container); // Create the dispatcher servlet's Spring application context AnnotationConfigWebApplicationContext dispatcherServlet = new AnnotationConfigWebApplicationContext(); dispatcherServlet.register(AppConfig.class); // Register and map the dispatcher servlet ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherServlet)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }

Database properties and hibernate Session Factory

package com.bala.spring.config; import java.util.Properties; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; 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.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.hibernate4.HibernateTransactionManager; import org.springframework.orm.hibernate4.LocalSessionFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @ComponentScan({ "com.bala.spring" }) @PropertySource(value = { "classpath:application.properties" }) public class DatabaseConfig { @Value("${db.driver}") private String DB_DRIVER; @Value("${db.password}") private String DB_PASSWORD; @Value("${db.url}") private String DB_URL; @Value("${db.username}") private String DB_USERNAME; @Value("${hibernate.dialect}") private String HIBERNATE_DIALECT; @Value("${hibernate.show_sql}") private String HIBERNATE_SHOW_SQL; @Value("${hibernate.hbm2ddl.auto}") private String HIBERNATE_HBM2DDL_AUTO; @Value("${entitymanager.packagesToScan}") private String ENTITYMANAGER_PACKAGES_TO_SCAN; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(DB_DRIVER); dataSource.setUrl(DB_URL); dataSource.setUsername(DB_USERNAME); dataSource.setPassword(DB_PASSWORD); return dataSource; } @Bean public LocalSessionFactoryBean sessionFactory() { LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); sessionFactoryBean.setDataSource(dataSource()); // sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN); sessionFactoryBean.setPackagesToScan(new String[] { "com.bala.spring.model" }); Properties hibernateProperties = new Properties(); hibernateProperties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO); hibernateProperties.put("hibernate.dialect", HIBERNATE_DIALECT); hibernateProperties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL); sessionFactoryBean.setHibernateProperties(hibernateProperties); return sessionFactoryBean; } @Bean public HibernateTransactionManager transactionManager() { HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory().getObject()); return transactionManager; } }

Model class for database operations.

@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } @NotNull @Column(name = "password") private String password; @Column(name = "email") private String email; @Column(name = "fname") private String fname; @Column(name = "username") private String username; @Column(name = "lname") private String lname; // @NotEmpty(message = "Please enter your phone") @Column(name = "phone") private String phone; @Column(name = "date_created") private Date dateCreated; @Column(name = "last_updated") private Date lastUpdated; private String passwordConfirm; //@Getters @Setters @toString() public User() { } public User(String email, String password, String fname, String lname, String phone) { this.email = email; this.password = password; this.fname = fname; this.lname = lname; this.phone = phone; } }

Write data access code

@Repository @Transactional public class UserDao { @Autowired private SessionFactory sessionFactory; private static final Logger logger = LoggerFactory.getLogger(UserDao.class); protected Session getSession() { return sessionFactory.getCurrentSession(); } public void save(User user) { getSession().save(user); getSession().flush(); return; } public List<user> getUserList() { // TODO Auto-generated method stub List<user> users = getSession().createCriteria(User.class).list(); return users; } }

Spring controller

package com.bala.spring.config.dao; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.sql.DataSource; import com.bala.spring.model.User; import javax.transaction.Transactional; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.ArrayList; import java.util.Date; import javax.transaction.Transactional; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Repository @Transactional public class UserDao { @Autowired private SessionFactory sessionFactory; private static final Logger logger = LoggerFactory.getLogger(UserDao.class); protected Session getSession() { return sessionFactory.getCurrentSession(); } public void save(User user) { logger.info("****************save user*****************************.", "save"); getSession().save(user); getSession().flush(); return; } /*public void delete(User user) { getSession().delete(user); return; } */ @SuppressWarnings("unchecked") public List<user> getAll() { return getSession().createQuery("from User").list(); } public User getByEmail(String email) { logger.info("****************getByEmail*****************************.", "getByEmail"); return (User) getSession().createQuery("from User where email = :email").setParameter("email", email) .uniqueResult(); } public User getByUsername(String username) { logger.info("****************getByEmail*****************************.", "getByUsername"); return (User) getSession().createQuery("from User where username = :username") .setParameter("username", username).uniqueResult(); } public List<user> getUserList() { // TODO Auto-generated method stub List<user> users = getSession().createCriteria(User.class).list(); return users; } }

Service layer

package com.bala.spring.service; import com.bala.spring.config.dao.UserDao; import com.bala.spring.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.List; @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public void save(User user) { userDao.save(user); } @Override public User findByUsername(String username) { return userDao.getByUsername(username); } @Override public List<user> getUserList() { // TODO Auto-generated method stub return userDao.getUserList(); } }

View files

register.jsp

%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ page session="true"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <c:set value="${pageContext.request.contextPath}" var="contextPath"> <c:set value="${pageContext.request.contextPath}" var="contextPath"> <html> <head> <jsp:include page="header.jsp"></jsp:include> </head> <body> <div class="login-page"> <div class="form"> <form:form action="register" class="login-form" method="POST" modelattribute="user"> <form:input class="form-control" id="inputName" path="fname" placeholder="Fisrt Name" type="text"> <form:input class="form-control" path="lname" placeholder="Last Name" type="text"> <form:input class="form-control" path="phone" placeholder="phone No" type="text"> <form:input class="form-control" path="email" placeholder="Email" required="true" type="email"> <form:input class="form-control" path="username" placeholder="username" required="true" type="username"> <form:input class="form-control" path="password" placeholder="Password" required="true" type="password"> <!-- <label> <input type="checkbox" required> Accept our <a href="#">privacy policy</a> and <a href="#">customer agreement</a> </label> --> <button class="btn btn-group btn-default btn-animated" type="submit">Sign Up </button> <p class="message">Already registered? <a href="login">Sign In</a></p> </form:input></form:input></form:input></form:input></form:input></form:input></form:form> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="${contextPath}/resources/js/bootstrap.min.js"></script> <script type="text/javascript"> $(document).ready(function () { console.log("hello"); $('.message a').click(function(){ $('form').animate({height: "toggle", opacity: "toggle"}, "slow"); }); }); </script> </body> </html>

login.jsp

<html> <head> <jsp:include page="header.jsp"></jsp:include> </head> <body> <div class="login-page"> <div class="form"> <form:form action="${contextPath}/login" class="login-form" method="POST" modelattribute="user"> <input name="${_csrf.parameterName}" type="hidden" value="${_csrf.token}" /> <form:input id="inputUserName" path="username" placeholder="User Name" required="true" type="text"> <span><form:errors cssclass="error" path="username"></form:errors></span> <form:input id="inputPassword" path="password" placeholder="Password" required="true" type="password"> <button class="btn btn-group btn-default btn-animated" type="submit">Log In </button> <p class="message">Not registered? <a href="register">Create an account</a></p> </form:input></form:input></form:form> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="${contextPath}/resources/js/bootstrap.min.js"></script> <script type="text/javascript"> $(document).ready(function () { console.log("hello"); $('.message a').click(function(){ $('form').animate({height: "toggle", opacity: "toggle"}, "slow"); }); }); </script> </body> </html>

success.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@ page session="true"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <c:set value="${pageContext.request.contextPath}" var="contextPath"> <html> <head> <jsp:include page="header.jsp"></jsp:include> </head> <body> <div class="jumbotron"> <h1>Welcome !!!</h1> <p> ${message}. </p> <p><a class="btn btn-primary btn-lg" href="home" role="button">Home</a></p> </div> </body> </html>

In this article, we have seen the Spring MVC Hibernate integration example using java configuration. All source code in the article can be found in the GitHub repository.