zoukankan      html  css  js  c++  java
  • Hibernate——编程式事务 小强斋

    编程式事务

    一、getCurrentSession()与openSession()的区别?
     * 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()创建的session则不会
     * 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭

    二、使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
     * 如果使用的是本地事务(jdbc事务)
     <property name="hibernate.current_session_context_class">thread</property>
     * 如果使用的是全局事务(jta事务)
     <property name="hibernate.current_session_context_class">jta</property>    

    三、例子:模拟日志管理(添加用户时,写入日志)

    因为事务是session.beginTransaction();由Session开启的,所有添加用户和相应的日志,必须在一个事务中,那么就必须使用同一个Seesion,传递太麻烦。采用getCurrentSession()创建的session会绑定到当前线程中变量ThreadLocal中。

    User.java

    package com.ncepu.usermgr.model;
    
    public class User {
    	
    	private int id;
    	
    	private String name;
    
    	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;
    	}
    }
    

    User.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">
    <hibernate-mapping package="com.ncepu.usermgr.model">
    	<class name="User" table="t_user">
    		<id name="id">
    			<generator class="native"/>
    		</id>
    		<property name="name"/>
    	</class>
    </hibernate-mapping>

    Log.java

    package com.ncepu.usermgr.model;
    
    import java.util.Date;
    
    public class Log {
    	
    	private int id;
    	
    	//操作日志、安全日志、事件日志
    	private String type;
    	
    	private String detail;
    	
    	private Date time;
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getType() {
    		return type;
    	}
    
    	public void setType(String type) {
    		this.type = type;
    	}
    
    	public String getDetail() {
    		return detail;
    	}
    
    	public void setDetail(String detail) {
    		this.detail = detail;
    	}
    
    	public Date getTime() {
    		return time;
    	}
    
    	public void setTime(Date time) {
    		this.time = time;
    	}
    }
    

    Log.hbm.xml

    <hibernate-mapping package="com.ncepu.usermgr.model">
    	<class name="Log" table="t_log">
    		<id name="id">
    			<generator class="native"/>
    		</id>
    		<property name="type"/>
    		<property name="detail"/>
    		<property name="time"/>
    	</class>
    </hibernate-mapping>

    UserManager接口

    package com.ncepu.usermgr.manager;
    
    import com.ncepu.usermgr.model.User;
    
    public interface UserManager {
    	
    	public void addUser(User user);
    }
    

    UserManagerImpl实现类

    package com.ncepu.usermgr.manager;
    
    import java.util.Date;
    
    import org.hibernate.Session;
    
    import com.ncepu.usermgr.model.Log;
    import com.ncepu.usermgr.model.User;
    import com.ncepu.usermgr.util.HibernateUtils;
    
    public class UserManagerImpl implements UserManager {
    
    	public void addUser(User user) {
    		Session session = null;
    		try {
    			//session = HibernateUtils.getSession();
    			session = HibernateUtils.getSessionFactory().getCurrentSession();
    			session.beginTransaction();
    			
    			session.save(user);
    
    			Integer.parseInt("asdfsdfsfsd");
    			Log log = new Log();
    			log.setType("安全日志");
    			log.setDetail("xxx进入系统");
    			log.setTime(new Date());
    
    			LogManager logManager = new LogManagerImpl();
    			logManager.addLog(log);
    
    			session.getTransaction().commit();
    		}catch(Exception e) {
    			e.printStackTrace();
    			session.getTransaction().rollback();
    //		}finally {
    //			HibernateUtils.closeSession(session);
    		}
    	}
    }
    

    LogManager接口

    package com.ncepu.usermgr.manager;
    
    import com.ncepu.usermgr.model.Log;
    
    public interface LogManager {
    	
    	public void addLog(Log log);
    }
    

    LogManagerImpl实现类

    package com.ncepu.usermgr.manager;
    
    import com.ncepu.usermgr.model.Log;
    import com.ncepu.usermgr.util.HibernateUtils;
    
    public class LogManagerImpl implements LogManager {
    
    	public void addLog(Log log) {
    		HibernateUtils.getSessionFactory().getCurrentSession().save(log);
    	}
    
    }
    

    Client.java

    package com.ncepu.usermgr.client;
    
    import com.ncepu.usermgr.manager.UserManager;
    import com.ncepu.usermgr.manager.UserManagerImpl;
    import com.ncepu.usermgr.model.User;
    
    public class Client {
    
    	public static void main(String[] args) {
    		User user = new User();
    		user.setName("张三");
    		
    		UserManager userManager = new UserManagerImpl();
    		userManager.addUser(user);
    	}
    }
    

    工具类SessionFactory

    package com.ncepu.usermgr.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
    	private static SessionFactory factory;
    	
    	static {
    		try {
    			Configuration cfg = new Configuration().configure();
    			factory = cfg.buildSessionFactory();
    		}catch(Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public static SessionFactory getSessionFactory() {
    		return factory;
    	}
    	
    	public static Session getSession() {
    		return factory.openSession();
    	}
    	
    	public static void closeSession(Session session) {
    		if (session != null) {
    			if (session.isOpen()) {
    				session.close();
    			}
    		}
    	}
    }
    

    导入数据库工具类

    package com.ncepu.usermgr.util;
    
    import org.hibernate.cfg.Configuration;
    import org.hibernate.tool.hbm2ddl.SchemaExport;
    
    public class ExportDB {
    
    	public static void main(String[] args) {
    		
    		//读取hibernate.cfg.xml文件
    		Configuration cfg = new Configuration().configure();
    		
    		SchemaExport export = new SchemaExport(cfg);
    		
    		export.create(true, true);
    	}
    }
    

    hibernate.cfg.xml配置文件

    <!DOCTYPE hibernate-configuration PUBLIC
    	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
    	<session-factory>
    		<property name="hibernate.connection.url">jdbc:mysql://localhost/spring_hibernate_1</property>
    		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">admin</property>
    		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    		<property name="hibernate.show_sql">true</property>
    		<property name="hibernate.current_session_context_class">thread</property>
    		<!-- 
    		<property name="hibernate.current_session_context_class">jta</property>
    		 -->		
    		<mapping resource="com/ncepu/usermgr/model/User.hbm.xml"/>
    		<mapping resource="com/ncepu/usermgr/model/Log.hbm.xml"/>
    	</session-factory>
    </hibernate-configuration>


     

  • 相关阅读:
    linux计划任务格式
    KVO监听数组的变化
    经典题目:输入半径求圆的面积
    /src/applicationContext.xml
    词法分析错题
    正规式与有限自动机
    词法分析程序的设计
    词法分析概述
    windows平台上 搭建 VisualSVN服务器 和 TortoiseSVN客户端
    maven error Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:3.1.0:single
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5429446.html
Copyright © 2011-2022 走看看