Hibernate学习(四):session.save()

简介:

好久没有写博客了,最近才发现Hibernae还没有写完,那就继续,就当自己好好复习了。言归正传、

一切的一切都要从数据的插入开始,没有数据的插入就没有数据来进行更新、删除和修改。在Hibernate中使用最频繁的用来插入数据的方法就是save()方法了。在Hibernate的官方API中对save方法的注释很简单:将指定的临时对象持久化,并首先指定一个标识符,也就是我们所说的OID,但是如果OID的生成策略是assigned的时候除外

注释虽然很简单,但是却向我们披露了足够的信息。我们从输入、操作、输出对它进行分析。

1.输入:一个处于临时状态的对象。这并不是说我们不能使用持久化对象和游离对象做参数,只是说这样操作不合规范。就像男人穿裙子一样,不是说你不能穿,只是这样不合常理而已。

2.操作:首先根据指定的OID生成策略给临时对象生成一个OID,一般来说此时临时对象的OIDNULL,除非你使用了assign策略或者人为的指定了一个OID,但是事实证明这时没有用的;接着把这个对象置入缓存中,使它成为持久化对象;最后,计划一个insert语句,注意,只是计划,并没有执行,只有当Session清理缓存时才执行sql语句。

3.输出:一个持久化对象和一条sql语句,这个说法不是很准确,这样说只是为了便于理解而已。

就我的理解,save()方法就像魔兽中英雄在外面练级的时候,把野怪身上掉的宝物捡起来放在身上一样。

前面我们说人为指定OID是没有用的,可以通过如下的代码片段来进行验证:

Customer customer=new Customer();

    customer.setId(3L);

    session.save(customer);

System.out.println(customer.getId());

结果表明,程序最后输出的ID是根据标识符生成器生成的。另外还要注意的一点就是,当对象处于持久化状态时,不能再随意修改它的OID,否则Session在清理缓存时会抛出异常,如:

Customer customer=new Customer();

    session.save(customer);

customer.setId(3L);

tx.commit();

此时程序抛出如下异常:org.hibernate.HibernateException: identifier of an instance of cn.edu.hust.cm.mypack.Customer was altered from 7 to 3

我还做了如下一个实验,代码片段如下:

Customer customer=new Customer();

    session.save(customer);

session.save(customer);

tx.commit();

第一次调用save()方法时customer处于临时状态,而第二次调用save()方法是时它已经处于持久化状态了,事实证明第二次的save操作完全是多余的,Hibernate并没有为它再计划一个insert语句。










本文转自 646676684 51CTO博客,原文链接:http://blog.51cto.com/2402766/615881,如需转载请自行联系原作者
目录
相关文章
|
10月前
|
SQL Java 数据库连接
Hibernate中的Session对象
Hibernate中的Session对象
57 0
hibernate4 could not initialize proxy - no Session
hibernate4 could not initialize proxy - no Session
|
SQL Java 数据库连接
Hibernate中Session的load和get方法的区别是什么?
主要有以下三项区别: ① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。 ② get方法直接返回实体类对象,load方法返回实体类对象的代理。
1061 0
|
SQL Java 数据库连接
Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?
Hibernate的对象有三种状态:瞬时态(transient)、持久态(persistent)和游离态(detached),如第135题中的图所示。瞬时态的实例可以通过调用save()、persist()或者saveOrUpdate()方法变成持久态;游离态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()变成持久态。
1265 0
|
缓存 Java 数据库连接
Hibernate-ORM:04.Hibernate中的get()和load()
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)   Hibernate中查询单个,...
1166 0