`

id提交策略集合!

阅读更多

package com.bjsxt.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import junit.framework.TestCase;

public class SessionFlushTest extends TestCase {
   
    /**
     * 测试uuid主键生成策略
     */
    public void testSave1() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User1 user = new User1();
            user.setName("李四");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
           
            //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理
            //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
            session.save(user);
           
            //调用flush,hibernate会清理缓存,执行sql
            //如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据
            //并且session中existsInDatebase状态为true
            session.flush();
           
            //提交事务
            //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
            //commit后数据是无法回滚的
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
    /**
     * 测试native主键生成策略
     */
    public void testSave2() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User2 user = new User2();
            user.setName("张三1");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
           
            //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id
            //纳入了session的管理,修改了session中existsInDatebase状态为true
            //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据
            session.save(user);
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
   
    /**
     * 测试uuid主键生成策略
     */
    public void testSave3() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User1 user = new User1();
            user.setName("王五");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
           
            //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理
            //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
            session.save(user);
           
            //将user对象从session中逐出,即session的EntityEntries属性中逐出
            session.evict(user);
           
            //无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出user对象进行insert操作后
            //需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session的entityEntries
            //中逐出了,所以找不到相关数据,无法更新,抛出异常
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
    /**
     * 测试uuid主键生成策略
     */
    public void testSave4() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User1 user = new User1();
            user.setName("王五");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
           
            //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理
            //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
            session.save(user);
           
            //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象
            //清除,并且设置session中existsInDatebase的状态为true
            session.flush();
           
            //将user对象从session中逐出,即session的EntityEntries属性中逐出
            session.evict(user);
           
            //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象
            //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
    /**
     * 测试native主键生成策略
     */
    public void testSave5() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User2 user = new User2();
            user.setName("张三11");
            user.setPassword("123");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
           
            //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id
            //纳入了session的管理,修改了session中existsInDatebase状态为true
            //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据
            session.save(user);
           
            //将user对象从session中逐出,即session的EntityEntries属性中逐出
            session.evict(user);
           
            //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象
            //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }
   
    /**
     * 测试assigned主键生成策略
     *
     */
    public void testSave6() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User3 user = new User3();
            user.setId("001");
            user.setName("张三");
           
            session.save(user);
           
            user.setName("王五");
            session.update(user);
           
            User3 user3 = new User3();
            user3.setId("002");
            user3.setName("李四");
            session.save(user3);
           
            //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
            //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
            //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
            //hibernate按照save(insert),update、delete顺序提交相关操作
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }   
   
    /**
     * 测试assigned主键生成策略
     *
     */
    public void testSave7() {
        Session session = null;
        Transaction tx = null;
        try {
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            User3 user = new User3();
            user.setId("003");
            user.setName("张三");
           
            session.save(user);
           
            user.setName("王五");
            session.update(user);
           
            session.flush();
           
            User3 user3 = new User3();
            user3.setId("004");
            user3.setName("李四");
            session.save(user3);
           
            //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
            //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=?
            //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?)
            //因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成
            //sql会按照我们的意愿执行
            tx.commit();
        }catch(Exception e) {
            e.printStackTrace();
            tx.rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }       
}

分享到:
评论

相关推荐

    jdbc基础和参考

    7.事务的提交(正常提交,不正常回滚) 8.关闭资源 主键增长策略: 1.increment:自动增长 select max(id) from table; 找到最大值之后+1赋给要持久化的对象 2.assigned:指派 hibernate不在自动生成主键值,需要...

    NHibernate参考文档 2.0.0 chm

    9.7.2. 提交数据库事务 9.7.3. 关闭ISession 9.8. 异常处理 9.9. 生命周期与对象图 9.10. 拦截器 9.11. 元数据API 10. 事务和并发 10.1. 配置,会话与工厂 10.2. 线程与连接 10.3. 关注对象标识(Considering object ...

    NHibernate中文帮组文档(2008.11月更新)

    9.7.2. 提交数据库事务 9.7.3. 关闭ISession 9.8. 异常处理 9.9. 生命周期与对象图 9.10. 拦截器 9.11. 元数据API 10. 事务和并发 10.1. 配置,会话与工厂 10.2. 线程与连接 10.3. 关注对象标识(Considering object ...

    hibernate 教程

    提交数据库事务 9.7.3. 关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行...

    hibernate

    提交数据库事务 9.7.3. 关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API 10. 事务和并行...

    从J2SE到J2EE知识点介绍

    (七) ID的生成策略 215 1. increment 216 2. identity 216 3. sequence 216 4. hilo 217 5. seqhilo 217 6. uuid 217 7. guid 217 8. native 217 9. assigned 217 10. select 217 11. foreign 218 (八) 复合自然主键...

    网络数据库安全设计与实现.doc

    本系统在进行SQL语句以及 存储过程调用的时候,直接使用Parameters集合,这样可以有效实现不管用户输入何字 符,都可以视为文本进行处理,且能够对字符进行类型以及长度方面的检查,有不合格 字符值时还可以触发异常...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     事务控制语言(Transactional Control Language,TCL),用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 二、 Oracle的数据类型 类型 参数 描述 字符类型...

    asp.net知识库

    完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算...

    Spring面试题

    通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。 Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring ...

    大学文献检索资料 DOC

    章节详细,涵盖大学文献检索课件资料 第一章 信息检索的基本知识 第一节 信息、知识、文献、情报 信息: 应用文字、数据和信号形式通过一定的传递和处理,来表现各种相互联系的客观事物在运动变化中所具有特征性的...

    MYSQL中文手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据...

    MySQL 5.1参考手册中文版

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据...

    mysql官方中文参考手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    MySQL 5.1参考手册

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    网上会展的未来发展趋势

    “网上会展”以其高效、灵敏的特点,表现出特殊的应用价值,实现了人们之间在不接触的情况下,照常经济交往与贸易活动,有效阻断了传统展览密集人群,集合传染源的途径。在SARS期间,以“非接触经济”形态出现的...

    MySQL5.1参考手册官方简体中文版

    5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序...

    mysql5.1中文手册

    示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 ...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics