Spring学习历程---Hibernate访问数据库可脱离事务管理器

来源:互联网 发布:orange作图软件中文版 编辑:程序博客网 时间:2024/05/16 17:55

JdbcTemplate执行的语句马上提交,没有事务,所以没有必要在Spring应用中配置事务管理器,因为即使配置了,也没有用。

对于Hibernate而言,情况便有不同,因为hibernate并不会立刻发送SQL语句,只在commit 或 flush 一级缓存时,才真正的向数据库发送语句。

所以,即使底层数据库不支持事务,Hibernate的事务管理也是有一定好处的,不会对数据操作产生负面影响。

但是,不使用Hibernate事务管理器,在Spring中,Hibernate照样可以工作。

User.java

package com.baobaotao;import org.apache.commons.lang.builder.ReflectionToStringBuilder;import javax.persistence.Entity;import javax.persistence.Table;import javax.persistence.Column;import javax.persistence.Id;import java.lang.reflect.Field;import java.io.Serializable;/** * @author 陈雄华 * @version 1.0 */@Entity@Table(name="T_USER")public class User implements Serializable{    @Id    @Column(name = "USER_NAME")    private String userName;    private String password;    private int score;    @Column(name = "LAST_LOGON_TIME")    private long lastLogonTime = 0;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public int getScore() {        return score;    }    public void setScore(int score) {        this.score = score;    }    public long getLastLogonTime() {        return lastLogonTime;    }    public void setLastLogonTime(long lastLogonTime) {        this.lastLogonTime = lastLogonTime;    }    public String toString() {        return (new ReflectionToStringBuilder(this) {            protected boolean accept(Field f) {                if(f.getType().isPrimitive() || f.getType() == String.class ){                    return true;                }else{                    return false;                }            }        }).toString();    }}
这只是向数据库表映射而已。


UserHibernateWithoutTransManagerService.java

package com.baobaotao.withouttx.hiber;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.core.io.ClassPathResource;import org.springframework.core.io.Resource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;import org.springframework.stereotype.Service;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.orm.hibernate3.HibernateTemplate;import org.apache.commons.dbcp.BasicDataSource;import org.springframework.test.jdbc.SimpleJdbcTestUtils;import com.baobaotao.User;@Service("hiberService")public class UserHibernateWithoutTransManagerService {    @Autowired    private HibernateTemplate hibernateTemplate;    public void addScore(String userName,int toAdd){        User user = hibernateTemplate.get(User.class,userName);        user.setScore(user.getScore()+toAdd);        //在无事务上下文的环境下,显式调用update将即时向数据库发送SQL        hibernateTemplate.update(user);    }    public static void main(String[] args) {        ApplicationContext ctx = new ClassPathXmlApplicationContext("com/baobaotao/withouttx/hiber/hiberWithoutTx.xml");        UserHibernateWithoutTransManagerService service = (UserHibernateWithoutTransManagerService)ctx.getBean("hiberService");        JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");        BasicDataSource basicDataSource = (BasicDataSource)jdbcTemplate.getDataSource();        //①检查数据源autoCommit的设置        System.out.println("autoCommit:"+ basicDataSource.getDefaultAutoCommit());        //②插入一条记录,初始分数为10        jdbcTemplate.execute("INSERT INTO t_user(user_name,password,score,last_logon_time) VALUES('tom','123456',10,"+System.currentTimeMillis()+")");        //③调用工作在无事务环境下的服务类方法,将分数添加20分        service.addScore("tom",20);                //④查看此时用户的分数        int score = jdbcTemplate.queryForInt("SELECT score FROM t_user WHERE user_name ='tom'");        System.out.println("score:"+score);        jdbcTemplate.execute("DELETE FROM t_user WHERE user_name='tom'");    }}

hiberWithoutTx.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:context="http://www.springframework.org/schema/context"       xmlns:p="http://www.springframework.org/schema/p"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"><context:property-placeholder location="classpath:jdbc.properties"/>    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close" p:driverClassName="${jdbc.driverClassName}"p:url="${jdbc.url}" p:username="${jdbc.username}"p:password="${jdbc.password}"/>    <bean id="jdbcTemplate"          class="org.springframework.jdbc.core.JdbcTemplate"          p:dataSource-ref="dataSource"/>    <bean id="sessionFactory"          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"          p:dataSource-ref="dataSource">        <property name="annotatedClasses">            <list>                <value>com.baobaotao.User</value>            </list>        </property>        <property name="hibernateProperties">            <props>                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>                <prop key="hibernate.show_sql">true</prop>            </props>        </property>    </bean>    <bean id="hibernateTemplate"          class="org.springframework.orm.hibernate3.HibernateTemplate"          p:sessionFactory-ref="sessionFactory"/>              <context:component-scan base-package="com.baobaotao.withouttx.hiber"/>      </beans>
没有配置Hibernate事务管理器,然而程序依然可以运行,说明hibernate在spring中,没有事务管理器的情况下,依然可以正常的进行数据的访问。




0 0
原创粉丝点击