ssh的各个版本要搭配好,struts2.3一般搭配hibernate4.x,我下的是4.3。

Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。这里简单介绍了hibernate4相对于hibernate3配置时出现的错误,只列举了问题和解决方法,详细原理如果大家感兴趣还是去自己搜吧,网上很多。

  1. Spring3.1去掉了HibernateDaoSupport类。hibernate4需要通过getCurrentSession()获取session。并且设置
    <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
    (在hibernate3的时候是thread和jta)。

  2. 缓存设置改为<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
                    <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>

  3. Spring对hibernate的事务管理,不论是注解方式还是配置文件方式统一改为:
    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" >  
    <property name="sessionFactory"><ref bean="sessionFactory"/>
    </property> 
    </bean>

  4. getCurrentSession()事务会自动关闭,所以在有所jsp页面查询数据都会关闭session。要想在jsp查询数据库需要加入:
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter过滤器。

  5. Hibernate分页出现 ResultSet may only be accessed in a forward direction 需要设置hibernate结果集滚动
     <prop key="jdbc.use_scrollable_resultset">false</prop>

--------------------------------------------------------------------

找到篇好文章,我之前遇到的问题都在这都能找到。其实出现这些问题的关键就是hibernate4和hibernate3出现了session管理的变动。

spring也作出相应的变动....

错误1:java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider

原因:spring的sessionfactory和transactionmanager与支持hibernate3时不同。

解决:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

...

</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"/>

</bean>

错误2:java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session

原因:hibernate4之后,spring31把HibernateDaoSupport去除,包括数据访问都不需要hibernatetemplate,这意味着dao需要改写,直接使用hibernate的session和query接口。

解决:为了改写dao,足足花了一天时间,然后一个个接口进行单元测试,这是蛋疼的一个主要原因。

错误3:nested exception is org.hibernate.HibernateException: No Session found for current thread

原因:发现一些bean无法获得当前session,需要把之前一些方法的事务从NOT_SUPPORT提升到required,readonly=true

见https://jira.springsource.org/browse/SPR-9020, http://www.iteye.com/topic/1120924

解决:

<tx:advice id="baseServiceAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="get*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->

<tx:method name="find*" read-only="true" propagation="REQUIRED"/><!--之前是NOT_SUPPORT-->

<tx:method name="save*" propagation="REQUIRED"/>

<tx:method name="update*" propagation="REQUIRED"/>

<tx:method name="remove*" propagation="REQUIRED"/>

<tx:method name="add*" propagation="REQUIRED"/>

<!--默认其他方法都是REQUIRED-->

<tx:method name="*"/>

</tx:attributes>

</tx:advice>

错误4:与错误3报错类似,java.lang.NoSuchMethodError:org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;

at org.springframework.orm.hibernate3.SessionFactoryUtils.doGetSession(SessionFactoryUtils.java:324) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]

at org.springframework.orm.hibernate3.SessionFactoryUtils.getSession(SessionFactoryUtils.java:202) [spring-orm-3.1.1.RELEASE.jar:3.1.1.RELEASE]

at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

原因:因为opensessioninview filter的问题,如果你的配置还是hibernate3,需要改为hibernate4

<filter>

<filter-name>openSessionInViewFilter</filter-name>

<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>

</filter>

--------------------------------------------------------------------

由于Hibernate4已经完全可以实现事务了, 与Spring3.1中的hibernatedao,hibernateTemplete等有冲突,所以Spring3.1里已经不提供Hibernatedaosupport,HibernateTemplete了,只能用Hibernate原始的方式用session:

Session session = sessionFactory.openSession();
        Session session = sessionFactory.getCurrentSession();
在basedao里可以用注入的sessionFactory获取session.

注意, 配置事务的时候必须将父类baseServiceImpl也配上,要不然会出现错误:No Session found for currentthread, 以前是不需要的

SessionFactory.getCurrentSession()的后台实现是可拔插的。因此,引入了新的扩展接口 (org.hibernate.context.spi.CurrentSessionContext)和

新的配置参数(hibernate.current_session_context_class),以便对什么是“当前session”的范围和上下文(scope and context)的定义进行拔插。

Spring @Transactional声明式事务管理,”currentSession”的定义为: 当前被 Spring事务管理器 管理的Session,此时应配置:

hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext。

 

此处一定注意 使用 hibernate4,在不使用OpenSessionInView模式时,在使用getCurrentSession()时会有如下问题: 当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。 这是因为getCurrentSession()在没有session的情况下不会自动创建一个,不知道这是不是Spring3.1实现的bug。 因此最好的解决方案是使用REQUIRED的传播行为

打开eclipse工具,选择HELP---Install new software----输入网址,如我们这里要安装hibernate tools进行逆向工程的建立,输入http://download.jboss.org/jbosstools/updates/development 选择hibernate tools----安装更新。

在线安装太慢,我们可以去http://www.jboss.org/tools/download/

下载对应eclipse版本的插件。

我的java ee是kepler版本的,

第0步:部署

将lib下required文件夹下的所有jar包复制到WEB-INF\lib\目录下

1、  创建数据库,数据库名hibernate

-- ----------------------------
-- Table structure for `users`
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`tel` varchar(20) DEFAULT NULL,
`address` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.在src下创建hibernate.cfg.xml配置文件

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> <!-- 数据库驱动名称 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库链接地址 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 数据库用户名称 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="connection.password">admin</property>
<!-- 设置数据库连接池默认个数 -->
<property name="connection.pool_size">1</property>
<!-- 设置数据库SQL语言类型 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 设置是否显示SQL语句-->
<property name="show_sql">true</property>
<!-- 设置是否格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 设置使用线程-->
<property name="current_session_context_class">thread</property>
<!-- 设置hibernate的映射文件-->
<mapping resource="edu/dzu/vo/UsersVo.hbm.xml"/> </session-factory>
</hibernate-configuration>

填写好数据库名,密码,用户名即可。

3.编写java类:(创建实体类)

Users.java

package edu.dzu.vo;

import java.io.Serializable;

public class Users implements Serializable {

    /**
*
*/
private static final long serialVersionUID = 1L; private Integer id;
private String name;
private Integer age;
private String tel;
private String address; public Users(){ } public Users(Integer id){
this.id = id;
} public Users(Integer id, String name,
Integer age, String tel, String address){
this.id = id;
this.name = name;
this.age = age;
this.tel = tel;
this.address = address;
} 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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }

4.在src中创建edu.dzu.vo包,然后在包中创建:

UsersVo.hbm.xml (在實體類的包中創建相應的hbm文件,用來指定實體類和數據庫映射關系)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Hibernate-mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="edu.dzu.vo.Users" table="users" catalog="hibernate"> <id name="id" type="java.lang.Integer">
<column name="id"></column>
<generator class="assigned"></generator>
</id> <property name="name" type="java.lang.String">
<column name="name" length="20"></column>
</property> <property name="age" type="java.lang.Integer">
<column name="age"></column>
</property> <property name="tel" type="java.lang.String">
<column name="tel" length="20"></column>
</property> <property name="address" type="java.lang.String">
<column name="address" length="50"></column>
</property> </class> </hibernate-mapping>

五、將配置文件添加到hibernate的cfg的配置文件中

<!-- 加入實體類的映射文件 -->
 <mapping  resource="edu/dzu/vo/UsersVo.hbm.xml"/>

六、創建SessionFactory,SessionFactory是線程安全,所以整個SessionFactory應該基於單例的模式來創建
Configuration cfg = new Configuration().configure();
//在hibernate3中都是使用該種方法創建,但是在4中被禁用了
//cfg.buildSessionFactory();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(cfg.getProperties()).buildServiceRegistry();
SessionFactory factory = cfg.buildSessionFactory(serviceRegistry);

創建session
Session session = factory.openSession();

通過session來進行各種操作

我们的代码:

HibernateSessionFactory.java:

package edu.dzu.vo;

import org.hibernate.*;
import org.hibernate.cfg.Configuration; @SuppressWarnings("deprecation")
public class HibernateSessionFactory { private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal<Session> threadLocal =
new ThreadLocal<Session>();
private static Configuration configuration = new Configuration();
private static SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION; static {
sessionFactory = configuration.configure(configFile).buildSessionFactory();
} private HibernateSessionFactory(){ } public static Session getSession(){
Session session = threadLocal.get();
if(session == null || !session.isOpen()){
session = (sessionFactory != null ) ? sessionFactory.openSession():null;
threadLocal.set(session);
}
return session;
}
}

7.测试:

TestHibernate.java

package edu.dzu.vo;

import java.awt.Font;

import javax.swing.JOptionPane;

import org.hibernate.Session;
import org.hibernate.Transaction; public class TestHibernate { /**
* @param args
*/
public static void main(String[] args) { Users users = new Users();
users.setId(20121108);
users.setName("张三");
users.setAge(24);
users.setTel("010-87654321");
users.setAddress("上海黄浦"); Users users2 = new Users();
users2.setId(20121109);
users2.setName("李四");
users2.setAge(23);
users2.setTel("010-12345678");
users2.setAddress("北京朝阳"); Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
session.persist(users);
session.persist(users2);
trans.commit(); StringBuffer result = new StringBuffer();
result.append("添加成功!往数据库中添加如下数据:\n");
result.append("编号"+"地址"+"姓名"+"年龄"+"联系电话\t\r\n\r\n");
result.append(users.getId()+" ");
result.append(users.getAddress()+" ");
result.append(users.getName()+" ");
result.append(users.getAge()+" ");
result.append(users.getTel()+"\t\n\r"); result.append(users2.getId()+" ");
result.append(users2.getAddress()+" ");
result.append(users2.getName()+" ");
result.append(users2.getAge()+" ");
result.append(users2.getTel()+"\t\n\r"); session.close(); JOptionPane.getRootFrame().setFont(new Font("Arial", Font.BOLD, 14));
JOptionPane.showMessageDialog(null, result.toString()); } }

然后运行下TestHibernate.java,会发现数据库中多了几条记录,ok成功。

以上文件目录结构:

上面的例子注意参考了:http://www.cnblogs.com/ljmatlight/archive/2012/11/08/2760973.html

http://www.cnblogs.com/ljmatlight/archive/2012/11/08/2760973.html

http://rritw.com/a/JAVAbiancheng/Hibernate/20130403/334457.html

http://blog.csdn.net/undoner/article/details/8958512

http://www.cnblogs.com/tangyouwei/p/3171938.html

http://book.51cto.com/art/200905/125850.htm

hibernate安装和配置和第一个Hibernate应用的更多相关文章

  1. Hibernate入门(1)-第一个Hibernate程序

    Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...

  2. 配置和创建一个hibernate简单应用

    1.配置 到http://hibernate.org/orm/下载hibernate包然后解压 在eclipse中新建一个java project,如名为hibernate_test 再所建工程中新建 ...

  3. Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解

    在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...

  4. Hibernate学习(一)———— 第一个hibernate工程

    一.什么是Hibernate? 轻量级JavaEE应用的持久层框架,是一个完全的ORM框架.(说完这句话,肯定有很多人懵圈了,下面我来一个个解释) 持久化:将我们想要保存的数据保存到硬盘上,也就是我们 ...

  5. SharePoint 2010 RBS 安装和配置遇到的一个问题

    在按照微软官方的文档按照配置的时候遇到下面问题: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event ...

  6. Framework7 - 入门教程(安装、配置、创建一个H5应用)

    1,Framework7介绍 (1)Framework7 是一个开源免费的框架.可以用来开发混合移动应用(原生和 HTML 混合)或者开发 iOS & Android 风格的 WEB APP. ...

  7. Windows下pry安装和配置

    Windows下pry安装和配置 pry是一个增强型的交互式命令行工具,比irb强大. 有自动完成功能,自动缩进,有颜色.有更强大的调试功能. pry 安装很简单. 在终端输入: gem instal ...

  8. Linux下MyCat和MyCat_web的安装和配置

    Linux下MyCat和MyCat_web的安装和配置 Mycat 是一个数据库分库分表中间件 Mycat web 可以对 Mycat进行监控,这里分享一下 Mycat web 的搭建过程 详细内容可 ...

  9. MySQL 5.7 免安装版配置

      MySQL5.7免安装版配置 Mysql是一个比较流行且很好用的一款数据库软件,如下记录了我学习总结的mysql免安装版的配置经验. 一. 软件下载 5.7 32位https://dev.mysq ...

随机推荐

  1. Magento How To Display Product Custom Option On list.phtml

    Some time we need to display custom option of product on category list page to achive this task we o ...

  2. Longest Valid Parentheses 解答

    Question Given a string containing just the characters '(' and ')', find the length of the longest v ...

  3. Poj2761-Feed the dogs(伸展树求名次)

    Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...

  4. python练习linux下创建路径

    #coding=utf-8 import os class MakeDirectory(): def mkdir(self,path): # 去除首位空格 path=path.strip() # 去除 ...

  5. 百度之星B题(组合数)

    Problem B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  6. java与.net比较学习系列(7) 属性

    文章摘自:http://www.cnblogs.com/mcgrady/p/3411405.html 说起属性,实际上java中没有属性这个概念,只有字段和方法,但是可以通过私有字段和声明get,se ...

  7. 文件读写IO

    摘要:本文主要总结了以下有关文件读写的IO,系统调用与库函数. 1.初级IO函数:close,creat,lseek,open,write 文件描述符是一个整型数 1.1close 1.2int cr ...

  8. [ES7] Object.observe + Microtasks

    ES6: If you know about the Javascirpt's event loop. You know that any asyns opreations will be throw ...

  9. css-布局1-基本属性

    <!DOCTYPE html>CSS4-布局1-基本属性 属性:displayvisibilityfloatclear HTML元素类型:行内元素,块级元素 块级元素:最大的区别:换行行内 ...

  10. container宽度

    bootstrap:宽度太宽时无需改变container的宽度大小,只需:.row{margin-left: 30px;margin-right: 30px;}