Primefaces Spring和Hibernate集成示例教程
欢迎使用Spring Primefaces和Hibernate Integration示例。框架之间的集成是一项复杂的任务,而且大多需要花费大量时间来实现。我们 在单独的教程中讨论了 Primefaces,Spring和Hibernate框架,但这次我们将向您展示如何集成所有这些框架以创建分层(分层)应用程序。
目录[ 隐藏 ]
- 1 Spring Primefaces Hibernate
- 1.1 Spring Primefaces Hibernate必备工具
- 1.2 Primefaces Spring Hibernate项目结构
- 1.3创建数据库员工表
- 1.4创建Employee Model Bean
- 1.5 Spring Primefaces Hibernate Maven依赖项
- 1.6 Spring Primefaces - 休眠配置
- 1.7测试我们的Hibernate应用程序
- 1.8设置弹簧
- 1.9 Spring EmployeeService
- 1.10 Primefaces Managed Bean - RegisterEmployee
- 1.11 Primefaces - 注册表
- 1.12 Spring Primefaces Hibernate示例摘要
Spring Primefaces Hibernate
分层(分层)应用程序是一种流行的设计,大多数企业应用程序都与之对齐。其中:
- Primefaces框架将用于处理所有UI问题并验证客户端的输入。
- Hibernate框架将用于传递您自己的可能是MySQL数据库的持久性存储。
- Spring框架将用于粘合所有这些框架。
本教程旨在使用所有这些列出的框架实现分层应用程序。
Spring Primefaces Hibernate所需的工具
在开始深入研究之前,让我们看看您需要的所需工具:
- Eclipse Kepler 4.3。
- Hibernate 3.x.
- 春天4.x.
- Primefaces 5.x.
- JDK 1.6+。
- MySQL 5.x.
Primefaces Spring Hibernate项目结构
我们的最终项目结构如下图所示,我们将逐个浏览每个组件。
创建数据库员工表
MySQL数据库将用于保留所有员工实例/记录。使用过的员工表如下所示:
另外,在下面找到它的SQL create-script:
CREATE TABLE `employee` (
`EMP_ID` int(11) NOT NULL AUTO_INCREMENT,
`EMP_NAME` varchar(45) DEFAULT NULL,
`EMP_HIRE_DATE` datetime DEFAULT NULL,
`EMP_SALARY` decimal(11,4) DEFAULT NULL,
PRIMARY KEY (`EMP_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
创建员工模型Bean
在我们创建了一个Employee Table之后,现在是时候看看Employee类的样子了:
package com.journaldev.hibernate.data;
import java.util.Date;
public class Employee {
private long employeeId;
private String employeeName;
private Date employeeHireDate;
private double employeeSalary;
public long getEmployeeId() {
return employeeId;
}
public void setEmployeeId(long employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public Date getEmployeeHireDate() {
return employeeHireDate;
}
public void setEmployeeHireDate(Date employeeHireDate) {
this.employeeHireDate = employeeHireDate;
}
public double getEmployeeSalary() {
return employeeSalary;
}
public void setEmployeeSalary(double employeeSalary) {
this.employeeSalary = employeeSalary;
}
}
Spring Primefaces Hibernate Maven依赖项
Maven是一个构建工具,主要用于管理项目依赖项。因此,无需像通常那样下载JAR并将其附加到项目中。MySQL JDBC驱动程序,hibernate核心,Spring核心框架,Primefaces以及Spring Hibernate Primefaces集成所需的许多库。我们的最终pom.xml文件如下所示。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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.journaldev</groupId>
<artifactId>Primefaces-Hibernate-Spring-Integration-Sample</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Primefaces-Hibernate-Spring-Integration-Sample Maven Webapp</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories>
<dependencies>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- Faces Implementation -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.2.4</version>
</dependency>
<!-- Faces Library -->
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.2.4</version>
</dependency>
<!-- Primefaces Version 5 -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.0</version>
</dependency>
<!-- JSP Library -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<!-- JSTL Library -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.1.2</version>
</dependency>
<!-- Primefaces Theme Library -->
<dependency>
<groupId>org.primefaces.themes</groupId>
<artifactId>blitzer</artifactId>
<version>1.0.10</version>
</dependency>
<!-- Hibernate library -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.10.Final</version>
</dependency>
<!-- MySQL driver connector library -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<!-- Spring ORM -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<!-- Spring Web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.3.RELEASE</version>
</dependency>
<!-- Required By Hibernate -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
</dependencies>
</project>
Spring Primefaces - Hibernate配置
Hibernate是一种标准的对象关系映射(ORM)解决方案,它用于将对象域映射到关系表格公式。Hibernate配置过程需要以下步骤:
- 在hibernate配置文件中指定所有相关的数据库信息,如驱动程序,JDBC URL,hibernate方言和hibernate会话上下文,主要使用 hibernate.cfg.xml。Hibernate实现本身将使用Dialect,以确保有效地完成映射过程的执行。该文件应位于项目的src / main / resources文件夹下。
- 指定hibernate的映射文件。映射文件将包含所有映射信息,如对象表,属性列和关联关系,domain-classes.hbm.xml文件主要用于此目的。此文件应位于项目的src / main / resources文件夹下,以便它位于应用程序的类路径中。
- 重要的是要说当我们要使用Spring时需要进行一些修改。
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/journaldev</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- SQL dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Specify session context -->
<property name="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</property>
<!-- Show SQL -->
<property name="hibernate.show_sql">true</property>
<!-- Referring Mapping File -->
<mapping resource="domain-classes.hbm.xml"/>
</session-factory>
</hibernate-configuration>
domain-classes.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="com.journaldev.hibernate.data.Employee" table="employee">
<id name="employeeId" column="EMP_ID" type="long">
<generator class="native" />
</id>
<property name="employeeName" column="EMP_NAME" type="string"/>
<property name="employeeHireDate" column="EMP_HIRE_DATE" type="date"/>
<property name="employeeSalary" column="EMP_SALARY" type="double"/>
</class>
</hibernate-mapping>
测试我们的Hibernate应用程序
到目前为止,我们已经创建了一个配置了所需依赖项的Eclipse Web项目,创建了数据库Employee Table并创建了hibernate框架。
在开始使用Spring集成并开发Primefaces UI表单之前,让我们看看如何使用简单的Java Application来获取针对我们自己的数据库保存的Employee实例。鉴于Java应用程序将帮助我们确定我们将获得的好处,特别是在以后使用Spring框架时。
package com.journaldev;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import com.journaldev.hibernate.data.Employee;
public class Main {
public static void main(String [] args){
// Create a configuration instance
Configuration configuration = new Configuration();
// Provide configuration file
configuration.configure("hibernate.cfg.xml");
// Build a SessionFactory
SessionFactory factory = configuration.buildSessionFactory(new StandardServiceRegistryBuilder().configure().build());
// Get current session, current session is already associated with Thread
Session session = factory.getCurrentSession();
// Begin transaction, if you would like save your instances, your calling of save must be associated with a transaction
session.getTransaction().begin();
// Create employee
Employee emp = new Employee();
emp.setEmployeeName("Peter Jousha");
emp.setEmployeeSalary(2000);
emp.setEmployeeHireDate(new Date());
// Save
session.save(emp);
// Commit, calling of commit will cause save an instance of employee
session.getTransaction().commit();
}
}
以下是对上述代码的详细说明:
- Hibernate需要一个定义的上下文来使您获得的会话受到影响。标准Java应用程序上下文可以通过提供hibernate的属性hibernate.current_session_context_class来实现 。org.hibernate.context.internal.ThreadLocalSessionContext的值将被绑定到当前执行的线程的上下文。这意味着,如果您在活动事务中针对会话对象调用了任何类型的CRUD操作 ,则一旦提交了事务,它们将执行到您自己的数据库中。在我们的示例中,已保存新的员工实例。如果您使用过hibernate 3,则此属性应该是 线程而不是使用ThreadLocalSessionContext。
- Hibernate 4用于测试目的,这个版本的hibernate在与Spring 4集成时不适用。要与Spring 4集成,你已经要求使用Hibernate 3。
- 使用最新版本的hibernate需要您使用
StandardServiceRegistryBuilder
构建SessionFactory。
设置弹簧
Spring是一个综合框架,它主要用于控制反转(IoC),它考虑了众所周知的概念依赖注入的更一般类别。
但是,提供的简单Java应用程序使您能够根据自己的数据库保存Employee实例,但通常情况下,这不是大多数应用程序用于配置自己的hibernate持久层的方式。
使用Spring将帮助您避免所有创建和关联对象的东西。创建所需对象,关联其他对象主要是Spring作业。以下是Spring上下文配置文件,更新的hibernate配置,更新的Maven pom.xml和我们的部署描述符文件。让我们看看如何配置所有这些以正确使用Spring。
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
<!-- Enable Spring Annotation Configuration -->
<context:annotation-config />
<!-- Scan for all of Spring components such as Spring Service -->
<context:component-scan base-package="com.journaldev.spring.service"></context:component-scan>
<!-- Create Data Source bean -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/journaldev" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- Define SessionFactory bean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>domain-classes.hbm.xml</value>
</list>
</property>
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- Transaction Manager -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Detect @Transactional Annotation -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- SQL dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
</session-factory>
</hibernate-configuration>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5" metadata-complete="true">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
</web-app>
以下是上面给出的代码的详细说明:
- 我们通过实例化一个名为sessionFactory的Spring Bean创建了一个SessionFactory 。实例化SessionFactory确实需要传递一个数据源实例的瞬间,传递映射文件(domain-classes.hbm.xml原样),通过使用hibernate.cfg.xml传递所有必需的Hibernate属性。正如您所注意到的,hibernate.cfg.xml不包含数据库信息,因为它立即被定义 - 数据源Bean - 并且不需要hibernate会话上下文,因为它由Apache Tomcat丰富。甚至Apache Tomact也不是托管服务器,但它包含帮助创建上下文会话的工具。
- 事务管理器将帮助您消除使用一段代码,如 session.getTransaction()。begin() 和 commit()。@Transactional注释将被替代使用。这意味着,执行任何使用@Transactional注释的Spring Service方法都将以跨国方式完成。如果您在诸如session.save()之类的跨国范围内 针对您的会话 调用了CRUD操作 ,它将在被调用方法结束时直接执行到您自己的数据库中。这就是所谓的交易分界。
- 您可以使用@Component定义自己的Spring服务。这将自动扫描。
- 我们的pom.xml maven依赖项文件 中添加了一个新库 ,hibernate 3需要common-dbcp 和 javassist。如果您注意到,Hibernate 4不需要这些库。
- 必须为web.xml文件添加Spring上下文加载器侦听器。此侦听器需要 在WEB-INF / 文件夹下定义applicationContext.xml 。这是Spring配置上下文文件的默认位置和名称。如果您要更改其位置和名称,则必须在下面添加所需路径提供的代码段。
配置非默认的Spring Context Location:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/SpringContext.xml</param-value>
</context-param>
注意:如果您正在寻找Spring 4和Hibernate 4集成,我们需要在Spring Bean配置文件中进行一些小的更改,您可以在Spring Hibernate Integration Example中获得有关它的更多详细信息。
Spring EmployeeService
在像我们这里所做的那样的分层应用程序中,所有业务操作都必须通过服务来实现。Spring为您提供了定义自己的服务的能力,这些服务将包含您自己的业务规则。EmployeeService将包含创建Employee所需的业务。
package com.journaldev.spring.service;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import com.journaldev.hibernate.data.Employee;
@Component
public class EmployeeService {
@Autowired
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public void register(Employee emp){
// Acquire session
Session session = sessionFactory.getCurrentSession();
// Save employee, saving behavior get done in a transactional manner
session.save(emp);
}
}
以下是上述代码的详细说明:
- EmployeeService是一个Spring服务,@ Component注释用于定义Spring Service。默认情况下,Spring将扫描您提到的包,以便根据上下文定位您的服务:component-scan Tag。
- @Autowired将帮助您获得所需的实例注入。这是依赖注入或IoC(控制反转)概念。这是一个重要的概念,它意味着不要让开发人员控制创建实例的过程,也需要进行必要的关联。它使所有这些创造和关联在后面看到。这是Spring令人难以置信的力量。@Autowired用于注入一个SessionFactory实例,如果您担心性能问题,可以将SessionFactory bean定义为单例范围。有关自动装配的完整信息,请阅读Spring自动装配示例。
- @Transactional注释用于事务划分目的。事务划分用于将上下文会话与活动事务相关联。这将导致CRUD操作针对您自己的数据库执行。您应该通过Spring声明事务管理示例。
Primefaces Managed Bean - RegisterEmployee
Managed Bean是一个JSF工具,它用于处理所有必需的用户界面验证。在分层应用程序中,Managed Bean用于调用业务服务。您可能想知道,一旦您知道将EmployeeService Spring bean注入您自己的Managed Bean就适用了。如果您使用@ManagedProperty注释,那将成为现实。
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
version="2.2">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
package com.journaldev.prime.faces.beans;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import com.journaldev.hibernate.data.Employee;
import com.journaldev.spring.service.EmployeeService;
@ManagedBean
@SessionScoped
public class RegisterEmployee {
@ManagedProperty("#{employeeService}")
private EmployeeService employeeService;
private Employee employee = new Employee();
public EmployeeService getEmployeeService() {
return employeeService;
}
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public String register() {
// Calling Business Service
employeeService.register(employee);
// Add message
FacesContext.getCurrentInstance().addMessage(null,
new FacesMessage("The Employee "+this.employee.getEmployeeName()+" Is Registered Successfully"));
return "";
}
}
以下是上述代码的详细说明:
- RegisterEmployee Managed Bean是使用
@ManagedProperty
注释开发的,它将帮助您注入Spring EmployeeService实例。如果您不提供包含新添加的Spring的el-resolver 的特殊faces-config.xml文件,则该关联将不适用。 - Primefaces UI表单将帮助您收集有关已注册员工的所有必需信息。
- 注册操作将询问EmployeeService保存给定的员工实例。
Primefaces - 注册表格
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
<script name="jquery/jquery.js" library="primefaces"></script>
<title>Register Employee</title>
</h:head>
<h:form>
<p:growl id="messages"></p:growl>
<p:panelGrid columns="2">
<p:outputLabel value="Enter Employee Name:"></p:outputLabel>
<p:inputText value="#{registerEmployee.employee.employeeName}"></p:inputText>
<p:outputLabel value="Enter Employee Hire Date:"></p:outputLabel>
<p:calendar value="#{registerEmployee.employee.employeeHireDate}"></p:calendar>
<p:outputLabel value="Enter Employee Salary:"></p:outputLabel>
<p:inputText value="#{registerEmployee.employee.employeeSalary}"></p:inputText>
</p:panelGrid>
<p:commandButton value="Register" action="#{registerEmployee.register}" update="messages"></p:commandButton>
</h:form>
</html>
Spring Primefaces Hibernate示例摘要
Hibernate与Spring和Primefaces的集成是一项流行的开发任务。本教程将指导您彻底将Hibernate与Spring和Primeface集成,这将导致您让员工坚持使用您的数据库。有意提到了一些技术细节。通过下面的评论为我们做贡献,并找到下载目的的源代码。
下载Primefaces Spring Hibernate集成项目
转载来源:https://www.journaldev.com/4096/primefaces-spring-hibernate-integration-example-tutorial