`

Hibernate中Id生成策略与save方法是否发sql语句的探究(转载)

阅读更多
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);
   }
}
分享到:
评论

相关推荐

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.4.1 Session的save()和persist()方法  8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法 ...

    hibernate完整学习

    Hibernate的本质 也是处理对象和关系模型之间的转换,只是对...一个项目中,如果对sql语句的优化要求比较高,不适合用hibernate 3.如果一张表中有上亿级别的数据量,也不适合用hibernate(数据库读写分离,分库分表)

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.4.1 Session的save()和persist()方法  8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.4.1 Session的save()和persist()方法  8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.4.1 Session的save()和persist()方法  8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法 ...

    第24次课-1 Spring与Hibernate的整合

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...

    hibernate总结

    b) 在内存中,如果有多个set(代理)容器需要初始化, 则当访问任何一个代理set容器时,一次初始化n个set容器,减少sql语句; c) 产生的语句是:select * from ….. where FK in (?,?,?... …n); 3. 迫切(fetch)左外...

    jdbc基础和参考

    2.如果找不到,get()会立即发送sql语句到数据库中查找数据,如果找到就返回,如果找不到返回null; load:(使用延迟加载策略) 1.load()方法默认要加载的对象一定存在,所以很放心的使用代理对象,等到用到的时候从...

    模拟Hibernate

    刚学习了hibernate,就简单模拟了hibernate中session的save(Object obj)方法。使用方法跟原版一样,同样需要写hibernate.cfg.xml和实体类的映射文件,通过dom4j读取配置文件的内容,再使用反射技术拼成动态的sql语句...

    Mysql 原生语句中save or update 的写法汇总

    如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢?   新手最常见的写法是,先通过select语句查询记录是否存在,存在则使用update语句更新,不存在则使用insert语句插入。 ...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍关系数据库中的代理主键(不具有业务含义),接着介绍Hibernate提供的几种内置标识符生成器的用法及适用范围。 6.1 关系数据库按主键区分不同的记录 123 6.1.1 把主键定义为自动增长标识符类型 123 ...

    jsp hibernate 数据保存操作的原理

    数据的保存,更新和删除: 1、Session.save()方法: Session.save()方法用于实体对象的持久化保存,也就是说当执行session.save()方法时会生成对应的insert SQL语句,完成数据的保存。如下面的代码: User user=new ...

    spring3.2+strut2+hibernate4

    // 所有符合pointcut条件的类或方法,都执行myAdvice建议,advice里定义了,所有的save方法,find方法都要执行transactionManager这个切面。 // 并且save方法的事物是必须的,find方法是只读的。 --> ---------...

    支持多数据库的ORM框架ef-orm.zip

    EF-ORM中采用了独特的SQL解析和改写技术,能够主动检查并确保SQL语句或者SQL片段在各个数据库上的兼容性。 EF中除了Criteria API以外,可以直接使用“SQL语句”或者“SQL片段”。但是这些SQL语句并不是直接传送给...

    java面试题目与技巧1

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

    java面试题以及技巧

    │ Struts+Hibernate+Spring轻量级J2EE企业应用实战.pdf │ Struts中文手册.pdf │ Struts配置文件详解.txt │ 上海税友.txt │ 上海税友软件 面试题.doc │ 公司培训文档-混淆的基本概念.doc │ 基本算法.doc │ ...

Global site tag (gtag.js) - Google Analytics