Spring 和 Hibernate整合总结
来源:互联网 发布:淘宝宝贝图片一键下载 编辑:程序博客网 时间:2024/06/18 18:30
Spring和Hibernate整合
1.Spring整合Hibernate什么?
- 由IOC 容器生成Hibernate 的 SessionFactory;
- 让hibernate 使用上Spring 的声明式事务:
(1)单独使用 ORM 框架时, 必须为每个 DAO 操作重复某些常规任务. 例如: 打开关闭 Session 对象; 启动, 提交, 回滚事务等;
(2)Hibernate 上下文 Session 对象和 Spring 的事务管理合作的很好, 但此时需保证所有的DAO 方法都支持事务(公有的); - Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA且Spring 对这些 ORM 框架的支持是一致的, 因此可以把和 Hibernate 整合技术应用到其他 ORM 框架上.
- Spring 2.0 同时支持 Hibernate 2.x 和 3.x. 但 Spring 2.5 只支持 Hibernate 3.1 或更高版本;
2.Spring需要做什么?
- 对于 Hibernate 而言, 必须从原生的 Hibernate API 中构建 SessionFactory. 此外, 应用程序也无法利用 Spring 提供的数据存储机制(例如: Spring 的事务管理机制),所以:Spring 提供了对应的工厂 Bean:LocalSessionFactoryBean, 可以用单实例的形式在 IOC 容器中创建 SessionFactory 实例.
- 在Spring配置中配置SessionFactory:
(1)利用 LocalSessionFactoryBean 工厂 Bean, 声明一个使用 XML 映射文件的 SessionFactory 实例;
(2)在该工厂 Bean 指定 configLocation 属性来加载 Hibernate 配置文件;
(3)在该工厂 Bean 指定dataSource 属性来指定数据源,且会覆盖掉 Hibernate 配置文件里的数据库配置;
(4)在该工厂 Bean 指定 mappingResources 属性来指定Hibernate XML 映射文件的位置.该属性为 String[] 类型. 因此可以指定一组映射文件.
(5)在 hibernateProperties 属性中指定数据库方言等.
(6)可以将所有配置合并到 LocalSessionFactoryBean 中,从而忽略 Hibernate 配置文件.
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean> <!--2.配置Hibernate的SessionFactory实例 :通过Spring提供的:LocalSessionFactoryBean--> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 配置数据源属性 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置Hibernate配置文件的位置及名称 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置Hibernate映射文件的位置及名称,可以使用通配符 --> <property name="mappingLocations" value="classpath:com/ren/spring/hibernate/entities/*.hbm.xml"></property> </bean>
3.Hibernate需要做什么?
- 用 Hibernate 的上下文 Session 持久化对象:
(1)在 Hibernate 会话中调用原生的方法时, 抛出的异常依旧是原生的 HibernateException. 为了保持一致的异常处理方法, 即把 Hibernate 异常转换为 Spring 的 DataAccessException 异常, 那么必须为需要异常转换的 DAO 类添加 @Respository 注解.然后在注册一个实例, 将原生的 Hibernate 异常转换为 Spring 的 DataAccessException 层次结构中的数据存取异常. 这个 Bean 后置处理器只为添加了@Respository 注解的 Bean 转换异常.;
(2)从 Hibernate 3 开始, SessionFactory 新增加了 getCurrentSession() 方法, 该方法可直接获取“上下文“相关的 Session. (不用openSession());
(3)Hibernate 通过 CurrentSessionContext 接口的实现类和 配置参数hibernate.current_session_context_class定义 “上下文:
1》JTASessionContext: 根据 JTA 来跟踪和界定 Session 对象.
2》ThreadLocalSessionContext: 通过当前正在执行的线程来跟踪和界定 Session 对象
3》ManagedSessionContext: 通过正在当前执行来跟踪和界定 Session 对象. 但程序需要调用该类的静态方法来绑定 Sessio 对象, 取消绑定, flush 或者关闭 Session 对象;
(4)独立的 Hibernate 应用通常使用第二种应用(ThreadLocalSessionContext):
如果使用 ThreadLocalSessionContext 策略, Hibernate 的 Session 会随着 getCurrentSession() 方法自动打开, 随着事务提交自动关闭.
在Hibernate的配置文件中配置如下:<property name="hibernate.current_session_context_class">thread</property>
4.Spring 整合 Hibernate 步骤
1. 先导入Hibernate相关的jar包:
hibernate-release-4.2.4.Final\hibernate-release-4.2.4.Fina4.2.4.Final\lib\required下的所有包;
hibernate-release-4.2.4.Final\hibernate-release-4.2.4.Final\lib\optional\c3p0下的:
c3p0-0.9.2.1.jar;
数据库驱动:
Mysql:mysql-connector-java-5.1.40-bin.jar;
Oracle11g:ojdbc14.jar(product\11.2.0\dbhome_1\owb\wf\lib)
2. 在src下建Hibernate配置文件:hibernate.cfg.xml:(Mysql为例)
<?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> <!-- 配置Hibernate的基本信息 --> <!-- 1.数据源配置到IOC容器中,在此处不需要再配置 --> <!-- 2.关联的.hbm.xml也在IOC容器配置SessionFactory实例是配置 --> <!-- 3.在这里配置Hibernate的基本属性:方言、是否显示sql语句、格式化输出、生成数据表策略及二级缓存 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.format_sql">true</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">thread</property> <!-- 配置二级缓存 的相关属性--> </session-factory></hibernate-configuration>
3.建持久化类:
在src下建包,eg:com.ren.spring.hibernate.entities(VO.model)
Account.java:
package com.ren.spring.hibernate.entities;public class Account { private Integer id; private String name; private double balance;//余额 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getBalance() { return balance; } public void setBalance(double balance) { this.balance = balance; }}
Book.java:
package com.ren.spring.hibernate.entities;public class Book { private Integer id; private double price; private String bookName; private String isbn;//书号 private int stock;//库存 public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public int getStock() { return stock; } public void setStock(int stock) { this.stock = stock; }}
4.在相应包下建相应持久类的Hibernate映射文件:持久类名.hbm.xml
Account.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-2-28 21:06:54 by Hibernate Tools 3.5.0.Final --><hibernate-mapping> <class name="com.ren.spring.hibernate.entities.Account" table="SH_ACCOUNT"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="balance" type="double"> <column name="BALANCE" /> </property> </class></hibernate-mapping>
Book.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-2-28 21:06:54 by Hibernate Tools 3.5.0.Final --><hibernate-mapping> <class name="com.ren.spring.hibernate.entities.Book" table="SH_BOOK"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="native" /> </id> <property name="price" type="double"> <column name="PRICE" /> </property> <property name="bookName" type="java.lang.String"> <column name="BOOK_NAME" /> </property> <property name="isbn" type="java.lang.String"> <column name="ISBN" /> </property> <property name="stock" type="int"> <column name="STOCK" /> </property> </class></hibernate-mapping>
5.导入Spring相关的jar包:
(1)Spring下的包;
(2)日志相关的包:commons-logging-1.1.1.jar;
(3)与aop相关的包:aspectj.weaver.jar 、 spring-aspects.jar和aopalliance.jar(http://blog.csdn.net/yajing8/article/details/59005765);
6.在src下建数据库配置文件:
db.properties:
jdbc.user=rootjdbc.password=123456jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql://localhost:3306/数据库名jdbc.initPoolSize=5jdbc.maxPoolSize=10
7.新建一个测试源码文件夹test:(测试)
在其下建相应包和测试类:
TestSpringHibernate.java:
package com.ren.spring.hibernate.test;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import javax.sql.DataSource;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.ren.spring.hibernate.service.BookShopService;import com.ren.spring.hibernate.service.Cashier;public class TestSpringHibernate { private BookShopService bookShopService = null; private Cashier cashier = null; private ApplicationContext context = null; { context = new ClassPathXmlApplicationContext("applicationContext.xml"); bookShopService = (BookShopService) context.getBean(BookShopService.class); cashier = context.getBean(Cashier.class); } @Test public void testBookShopService() throws SQLException { bookShopService.purchase("zs", "1001"); } @Test public void testCashier() throws SQLException { List<String> isbns = new ArrayList<>(); isbns.add("1001"); isbns.add("1002"); cashier.checkout("zs", isbns); } @Test public void testDataSopurce() throws SQLException { DataSource dataSource = context.getBean(DataSource.class); System.out.println(dataSource.getConnection());//com.mchange.v2.c3p0.impl.NewProxyConnection@2a8bf658 }}
8.相应的数据库表:
每天积累一点点,每天进步一点点!
- hibernate和spring整合总结
- Spring 和 Hibernate整合总结
- Spring整合Hibernate总结
- 整合Spring和Hibernate
- Hibernate和Spring整合
- spring和hibernate整合
- Spring和Hibernate整合
- Spring和Hibernate整合
- spring和Hibernate 整合
- 整合Hibernate和Spring
- 整合Hibernate和Spring
- spring和Hibernate整合
- spring和hibernate整合
- Spring和Hibernate整合
- spring和hibernate整合
- Spring和hibernate整合
- Spring -- spring 和 hibernate 整合
- struts hibernate spring整合总结
- C# 6.0语法糖剖析
- sqlite能不能多线程并发访问
- 浏览器的工作原理
- muduo库整体架构简析
- Java多线程(6)——死锁
- Spring 和 Hibernate整合总结
- 更新Android Studio后出现Gradle xx project refresh failed Failed to open zip file的解决办法
- 8位数码管静态显示其中之二
- argparse
- Struts2.5配置动态加载action找不到页面
- bzoj 3170 计算几何 && bzoj 1604 计算几何+SBT维护
- Linux命令格式&查询目录中的内容
- 近年来15 个 Android 通用流行框架大全
- 小M哥安卓5期视频教程(基础+就业)