关于hibernate的一些事

关于hibernate的一些事 (此博文为http://my.oschina.net/u/555061/blog/506216后续)

1.简单说一下SessionFactory、Session 源自: http://blog.csdn.net/javaloveiphone/article/details/8155340

1.1、Hibernate中SessionFactory对象的创建代价很高,它是线程安全的对象,被设计成可以为所有的应用程序线程所共享。通常,SessionFactory会在应用程序启动时创建,一旦创建了SessionFactory将不会轻易关闭,只有当应用关闭时,SessionFactory才会关闭。
1.2、而Session的对象是轻量级的,它是线程不安全的。对于单个业务进程单个工作单元而言,Session只被使用一次。创建Session时,并不会立即打开与数据库之间的连接,Session只在需要进行数据库操作时,才会获取JDBC连接。因此,打开和关闭Session,并不会对性能造成很大的影响。甚至即使无法确定一个请求是否需要数据访问,也可以打开Session对象,因为如果不进行数据库访问,Session不会获取JDBC连接。
使用Spring管理hibernate的事务,在每个dao操作中使用SessionFactory.getCurrentSession()方法,该方法可以得到当前事务绑定的session。同时当前的Session和关联的Hibernate事务被绑定到当前线程上,虽然session不是线程安全的,但是通过这样的方式,每一个session都处于单线程中,避免session线程安全问题

1.3、不通过Spring管理事务,开启事务的主动性:

在sessionFactory.openSession()中,Hibernate会初始化数据库连接,与此同时,将其 AutoCommit设为关闭状态,这就是说,从SessionFactory获得session,其自动提交属性就已经被关闭了,事务需要主动、显示的调用才能生效,下面的代码不会对事务性数据库产生任何效果。
session=sessionFactory.openSession();
   session.save(user);
   session.close();
如果要使得代码真正作用到数据库,必须显示的调用Transaction指令
   session=sessionFactory.openSession();
   Transaction tx = session.beginTransaction();
   session.save(user);
   tx.commit();
   session.close();

前面1、2点都是没什么问题,但是第3点事务的问题,我跟该博主意见不一致,首先Spring可以管理由Hibernate的SessionFactory产生的事务,所以通过Spring管理Hibernate的事务是可行的。其次,在开启事务配置的同时,框架已经在自动帮你管理事务,也就是刚刚连续两个操作,一个save一个sqlquery,由于sqlquery失败导致save同时失败回滚(或者说就没有commit的后续操作),而如果再使用session.beginTransaction()则会导致org.hibernate.TransactionException: nested transactions not supported错误,分析字面上的意思和根据本人查询结果综合来看,就是因为多次开启事务导致错误,反过来说事务不需要在session.beginTransaction()的情况下才开启,框架自动已经就在配置好以后就开启了。

2.关于org.hibernate.MappingException: Unknown entity:错误

本人在发生的时候是由于没有写packagesToScan,以为可以在Spring自动包扫描的时候注册hibernateEmployee这个包下面的类为bean,没想到不行,需要在这里写

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan">
            <list>
                <value>com.zhxjz.model.hibernateEmployee</value>
            </list>
        </property>
		<property name="hibernateProperties">
			<props>
				<prop key="dialect">${hibernate.dialect}</prop>
				<prop key="show_sql">${hibernate.show_sql}</prop>
				<!-- <prop key="hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> -->
			</props>
		</property>
	</bean>
时间: 2024-11-02 00:36:19

关于hibernate的一些事的相关文章

mybatis与hibernate的区别

本文转载自:http://blog.csdn.net/wangpeng047/article/details/17038659 以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的,结合至今为止的经验,总结出以下几点: 1. hibernate是全自动,而mybatis是半自动. hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql

关于hibernate中提示can not create table ******

最近这两天,一直在搞hibernate,被 其中一个问题困扰了好久.在网上找了好久,一直都没有找到可行的方法,把jdk,jre,tomcat,装了拆,拆了装,可就是搞不好.实在是没有办法,又重新建了一个项目来测试,,从一点一滴开始试.所有的代码全部都手写,,,,可是问题依旧还在. 之所以一直没有找到解决办法,其实是自己的思维一直局限在一处,,,一直在想着hibernate只要把配置文件配置好,它就可以自己在数据库创建表结构,自己增删改查,相当的方便,可是自己 当时成功了,为什么这次却一而再再而三

Hibernate (开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

解决离线Could not parse configuration:hibernate.cfg.xml错误

离线使用hibernate tool 生成反向工程,在配置 配置文件完,生成配置文件后,会报出org.hibernate.HibernateException: Could not parse configuration:错误 原因:就是读取不到本地dtd约束,然后必须每次联网加载才行,具体原因不了解,因为网络这方面的解答都比较模糊,应该是小范围问题,感觉是jdk与tools要求版本不一致,导致部分插件未正常安装,解析出现问题 解决方式(同理可解决映射文件出现的解析不成的问题) : 首先确认cf

关于hibernate中对象的三种状态分析

一,首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load():持久态到瞬态的方法有delete():游离态到持久态的方法有update().saveOrUpdate().lock():持久态到游离态的方法有:session.close().session.evict().session.clear(). 二,Hibernate的状态 hibernate的

IntelliJ IDEA 13.x 下使用Hibernate + Spring MVC + JBoss 7.1.1

原文:IntelliJ IDEA 13.x 下使用Hibernate + Spring MVC + JBoss 7.1.1 从2004年开始做.NET到现在.直到最近要做一些JAVA的项目,如果说100个人写一篇关于.NET的文章,估计这10个人写的内容都是一样.但是如果说10个人写Java的文章,那真的是10个人10种写法.这就是最头痛的地方,开始学的时候真的很迷惑. 这里我们使用的是Hibernate 4.x + Spring MVC 3.x 1.建立一个Spring MVC的Project

关于hibernate实体类

给的数据库模型是sql2005的,然后在powerdesigner把数据库模型改成mysql的去建实体,建不上,貌似好多东西要改. 要做以下几件事: 1,加上uuid的东西,生成唯一id,类型是String,Java中实体类主键上加 @GenericGenerator(name="systemUUID",strategy="uuid") @GeneratedValue(generator="systemUUID") 有些用自增的感觉会比较好些.

SpringMVC+Apache Shiro+JPA(hibernate)案例教学(三)给Shiro登录验证加上验证码

序: 给Shiro加入验证码,有多种方式,当然你也可以通过继承修改FormAuthenticationFilter类,通过Shiro去验证验证码.具体实现请百度: 应用Shiro到Web Application(验证码实现) 而今天我要说的,既然使用的SpringMVC,为什么不直接在Controller中就处理验证码验证,让事情变的更简单一点呢? 一.新建ValidateCode.java验证码工具类 package org.shiro.demo.util; import java.util.

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 ----转----

Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为VO(Value Object). 瞬时态         由new命令开辟内存空间的java对象, eg. Person person = new Person(