Spring Hibernate集成示例教程

194 篇文章 3 订阅
22 篇文章 0 订阅

 

Spring Hibernate集成示例教程(Spring 4 + Hibernate 3和Hibernate 4)

 

Spring是最常用的Java EE Framework之一,而Hibernate是最流行的ORM框架。这就是Spring Hibernate组合在企业应用程序中大量使用的原因。最近我为Spring TutorialHibernate Tutorial撰写了很多文章,因此Spring hibernate集成的帖子很长一段时间。

 

目录[ 隐藏 ]

 

Spring Hibernate

今天在本教程中,我们将使用Spring 4并将其与Hibernate 3集成,然后更新同一个项目以使用Hibernate 4.由于Spring和Hibernate都有很多版本,Spring ORM工件同时支持Hibernate 3和Hibernate 4 ,我列出我在项目中使用的所有依赖项是很好的。

请注意,我注意到所有spring和hibernate版本都不兼容,下面的版本对我有用,所以我认为它们是兼容的。如果您正在使用其他版本并获得java.lang.NoClassDefFoundError,那么这意味着它们不兼容。主要是因为Hibernate类从一个包移动到另一个包导致此错误。例如,org.hibernate.engine.FilterDefinition类被移动到org.hibernate.engine.spi.FilterDefinition最新的hibernate版本中。

 

  • Spring Framework版本:4.0.3.RELEASE
  • Hibernate Core和Hibernate EntityManager版本:3.6.9.Final和4.3.5.Final
  • Spring ORM版本:4.0.3.RELEASE

数据库设置

我正在为我的项目使用MySQL数据库,因此在setup.sql脚本下面将为此示例创建必要的表。


CREATE TABLE `Person` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '',
  `country` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
commit;

Spring Hibernate集成示例项目结构

下图显示了最终的项目结构,我们将逐一介绍每个组件。

 

春眠 - 集成 - 示例项目

 

Maven依赖

我们将首先查看我们的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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.springframework.samples</groupId>
	<artifactId>SpringHibernateExample</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>

		<!-- Generic properties -->
		<java.version>1.6</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<!-- Spring -->
		<spring-framework.version>4.0.3.RELEASE</spring-framework.version>

		<!-- Hibernate / JPA -->
		<!-- <hibernate.version>4.3.5.Final</hibernate.version> -->
		<hibernate.version>3.6.9.Final</hibernate.version>

		<!-- Logging -->
		<logback.version>1.0.13</logback.version>
		<slf4j.version>1.7.5</slf4j.version>

	</properties>

	<dependencies>
		<!-- Spring and Transactions -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Spring ORM support -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring-framework.version}</version>
		</dependency>

		<!-- Logging with SLF4J & LogBack -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>${logback.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!-- Hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${hibernate.version}</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.9</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
	</dependencies>
</project>

Spring和Hibernate Integration Project的重要依赖项是:

 

  • spring-context和spring-tx用于核心Spring功能。请注意,我使用的是版本4.0.3.RELEASE。
  • spring ORM支持的spring-orm依赖,它是我们的spring项目中hibernate集成所必需的。
  • Hibernate框架的hibernate-entitymanager和hibernate-core依赖项。请注意,版本是3.6.9.Final,对于使用Hibernate 4,我们需要的是将其更改为4.3.5.Final,如上面pom.xml文件中所述。
  • mysql-connector-java for MySQL驱动程序,用于数据库连接。

模型类或实体Bean

我们可以使用基于Hibernate XML的映射以及基于JPA注释的映射。这里我使用JPA注释进行映射,因为hibernate提供了JPA实现。


package com.journaldev.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * Entity bean with JPA annotations
 * Hibernate provides JPA implementation
 * @author pankaj
 *
 */
@Entity
@Table(name="Person")
public class Person {

	@Id
	@Column(name="id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int id;
	
	private String name;
	
	private String country;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCountry() {
		return country;
	}

	public void setCountry(String country) {
		this.country = country;
	}
	
	@Override
	public String toString(){
		return "id="+id+", name="+name+", country="+country;
	}
}

DAO课程

我们将在DAO类中实现两个方法,首先将Person对象保存到表中,然后再从表中获取所有记录并返回Persons列表。


package com.journaldev.dao;

import java.util.List;

import com.journaldev.model.Person;

public interface PersonDAO {

	public void save(Person p);
	
	public List<Person> list();
	
}

上面的DAO类实现如下所示。


package com.journaldev.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.journaldev.model.Person;

public class PersonDAOImpl implements PersonDAO {

	private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    
	@Override
	public void save(Person p) {
		Session session = this.sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		session.persist(p);
		tx.commit();
		session.close();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Person> list() {
		Session session = this.sessionFactory.openSession();
		List<Person> personList = session.createQuery("from Person").list();
		session.close();
		return personList;
	}

}

请注意,这是我们使用Hibernate相关类的唯一地方。这种模式使我们的实现变得灵活,易于从一种技术迁移到另一种技术。例如,如果我们想使用iBatis ORM框架,我们只需要为iBatis提供DAO实现,然后更改spring bean配置文件。

 

在上面的例子中,我正在使用Hibernate会话事务管理。但我们也可以使用@Transactional注释使用Spring声明式事务管理,在Spring Transaction Management中阅读更多内容。

用于Hibernate 3集成的Spring Bean配置文件

让我们首先看一下Hibernate 3集成所需的spring bean配置,稍后我们将详细介绍。


<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	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-4.0.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

	<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/TestDB" />
		<property name="username" value="pankaj" />
		<property name="password" value="pankaj123" />
	</bean>

<!-- Hibernate 3 XML SessionFactory Bean definition-->
<!-- 	<bean id="hibernate3SessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mappingResources">
			<list>
				<value>person.hbm.xml</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<value>
				hibernate.dialect=org.hibernate.dialect.MySQLDialect
			</value>
		</property>
	</bean> -->

<!-- Hibernate 3 Annotation SessionFactory Bean definition-->
	<bean id="hibernate3AnnotatedSessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="annotatedClasses">
			<list>
				<value>com.journaldev.model.Person</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.current_session_context_class">thread</prop>
				<prop key="hibernate.show_sql">false</prop>
			</props>
		</property>
	</bean>
	
	<bean id="personDAO" class="com.journaldev.dao.PersonDAOImpl">
		<property name="sessionFactory" ref="hibernate3AnnotatedSessionFactory" />
	</bean>
</beans>

我们可以通过两种方式为Hibernate提供数据库连接细节,首先是通过hibernateProperties创建一个DataSource然后将其传递给hibernate 来传递所有内容。我更喜欢第二种方法,这就是为什么我们使用Apache Commons DBCP依赖来创建一个BasicDataSource通过设置数据库连接属性。

对于Spring和Hibernate 3集成,Spring ORM提供了两个类 - org.springframework.orm.hibernate3.LocalSessionFactoryBean当hibernate映射是基于XML的和org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean基于注释的映射时。LocalSessionFactoryBean如果您使用基于XML的映射,我在注释中提供了简单的bean配置。AnnotationSessionFactoryBean扩展LocalSessionFactoryBean类,因此它具有hibernate集成的所有基本属性。

这些属性是自我理解的,并且大多与hibernate相关,所以我不会详细介绍它们。但是如果你想知道hibernatePropertiesannotatedClasses的来源,你需要查看bean类源代码。

注意personDAO的bean定义,就像我之前说过的,如果我们必须切换到其他ORM框架,我们需要在这里更改实现类并设置我们需要的任何其他属性。

Spring 4 Hibernate 3测试程序

我们的设置现已准备就绪,让我们编写一个简单的程序来测试我们的应用程序。


package com.journaldev.main;

import java.util.List;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.journaldev.dao.PersonDAO;
import com.journaldev.model.Person;

public class SpringHibernateMain {

	public static void main(String[] args) {

		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
		
		PersonDAO personDAO = context.getBean(PersonDAO.class);
		
		Person person = new Person();
		person.setName("Pankaj"); person.setCountry("India");
		
		personDAO.save(person);
		
		System.out.println("Person::"+person);
		
		List<Person> list = personDAO.list();
		
		for(Person p : list){
			System.out.println("Person List::"+p);
		}
		//close resources
		context.close();	
	}
}

当我们执行上面的程序时,我们得到了很多与Hibernate相关的输出,因为我没有正确设置日志记录,但这超出了本教程的范围。但是我们得到了我们程序生成的以下输出。


Person::id=3, name=Pankaj, country=India
Person List::id=1, name=Pankaj, country=India
Person List::id=2, name=Pankaj, country=India
Person List::id=3, name=Pankaj, country=India

Spring 4 Hibernate 4集成更改

现在让我们将我们的应用程序更改为使用Hibernate 4而不是Hibernate 3.对于此迁移,我们只需要进行以下配置更改。

  1. 在pom.xml文件中将hibernate版本更改为4.3.5.Final,如上面的注释所示。
  2. 更改spring bean配置文件,到现在为止你一定已经知道Spring bean配置文件是spring和hibernate框架集成的关键。下面的spring bean配置文件适用于Spring 4和Hibernate 4版本。
    
    <?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:aop="http://www.springframework.org/schema/aop"
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	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-4.0.xsd
    		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    	<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/TestDB" />
    		<property name="username" value="pankaj" />
    		<property name="password" value="pankaj123" />
    	</bean>
    
    
    <!-- Hibernate 4 SessionFactory Bean definition -->
    <bean id="hibernate4AnnotatedSessionFactory"
    		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    		<property name="dataSource" ref="dataSource" />
    		<property name="annotatedClasses">
    			<list>
    				<value>com.journaldev.model.Person</value>
    			</list>
    		</property>
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    				<prop key="hibernate.current_session_context_class">thread</prop>
    				<prop key="hibernate.show_sql">false</prop>
    			</props>
    		</property>
    	</bean>
    
    	
    	<bean id="personDAO" class="com.journaldev.dao.PersonDAOImpl">
    		<property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
    	</bean>
    </beans>
    

    对于hibernate 4,我们需要使用org.springframework.orm.hibernate4.LocalSessionFactoryBeanSessionFactory bean,Spring ORM已经合并了Hibernate 3的两个类,现在只有一个类,这样可以避免混淆。所有其他配置与以前相同。

就是这样,我们的项目成功迁移到了Hibernate 4,整洁不是它。只需更改用于bean配置的SpringHibernateMainspring4.xml,它就可以正常工作,您将获得与以前相同的输出。

您可以从下面的链接下载最终项目,并使用更多配置来了解更多信息。

下载Spring Hibernate集成项目

 

转载来源:https://www.journaldev.com/3524/spring-hibernate-integration-example-tutorial

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值