1. 持久化实体

    Serializable save(Object obj) : 将obj对象变为持久化状态,该对象的属性将被保存到数据库。

    void persist(Object obj) : 将obj对象转化为持久化状态,该对象的属性将被保存到数据库。

    Serializable save(Object obj,Object pk)  : 将obj对象保存到数据库,保存到数据库时,指定主键值。

    void persist(Object obj,Object pk) : 将obj对象转化为持久化状态,保存到数据库时,指定主键值。

  2. 根据主键加载持久化实体

    News news = session.load(News.class,pk);

    如果没有匹配的数据库记录,load()方法可能抛出HibernateException异常;如果在持久化注解中指定了延迟加载,则load()方法会返回一个未初始化的代理对象,这个代理对象并没有加载数据记录,直到程序调用该代理对象的某方法时,Hibernate才会访问数据库。

    News news = session.get(News.class,pk);

    立即访问数据库,如果没有对应的记录,get()方法返回null,而不是返回一个代理对象。

  3. 更新持久化实体

    一旦加载了该持久化实例后,该实体就处于持久化状态,在代码中对持久化实例所做的修改被保存到数据库。

    程序对持久化实例所做的修改会在Session flush之前被自动保存到数据库,无须程序调用其他方法来将修改持久化。

    News news = session.load(News.class,pk);
news.setTitle("新标题");
session.flush();

  4. 更新脱管实体

    当程序修改脱管对象的状态后,程序应该显示地使用新的Session来保存这些修改。

    update()

    merge()

    updateOrSave()

    1. 当需要使用update()来保存程序对持久化对象所做的修改时,如果不清楚该对象是否曾经持久化过,那么程序可以选择使用updateOrSave() 方法,该方法自动判断该对象是否曾经持久化过,如果曾经持久化过,就执行update()操作;否则将执行save()操作。

    2. merge()方法不会持久化给定的对象。例如session.update(obj)之后,obj对象将会变成持久化状态;而执行session.merge(obj)代码后,obj对象依然不是持久化状态,merge()方法会返回obj对象的副本 -- -- -- 该副本处于持久化状态,与该session关联。

    3. 当程序使用merge()方法来保存程序对脱管对象所做的修改时,如果Session中存在相同持久化标识的持久化对象,merge()方法里提供的对象状态将覆盖原有持久化实例的状态。如果Session中没有相应的持久化实例,则尝试从数据库中加载,或者创建新的持久化实例,最后返回该持久化实例。

  5. 删除持久化实例

    使用delete() 方法来删除持久化实例

    News news = session.load(News.class,pk);
session.delete(news);

    啦啦啦

  提示:

    1. 如果News的标识属性(identifier)时generated类型的,那么Hibernate将会在执行save()方法时自动生成标识属性值,并将标识属性值分配给该News对象,并标识属性会在save()被调用时自动产生并分配给News对象。如果News的标识属性时assigned类型的,或者时复合主键(composite key),那么该标识属性值应当在调用save()之前手动赋给News对象。

    2. save()方法需要立即返回持久化对象的标识属性值,所以程序执行save()方法会立即将持久化对象对应的数据插入数据库;

    3. persist()则保证当它在一个事务外部被调用时,并不立即转换成insert语句。在需要封装一个长会话流程时候,persist()方法尤为重要。

    4. load()方法和get()方法的主要区别在于是否延迟加载,使用load()方法将具有延迟加载功能。

    5. 锁模式:使用load()或get()方法加载持久化对象时,可以制定一个“锁模式”参数。Hibernate使用LockOptions对象代表“锁模式”,LocakOptions提供了READ和UPGRADE两个静态属性来代表共享、修改锁。如果需要加载某个持久化对象以供修改(相当于使用SQL的select...for update语句来装载对象),则可用如下代码:

    News news = session.get(News.class,pk,LockOptions.UPGRADE);

      Session.LockRequest的lock()方法也将某个脱管对象重新持久化,但该脱管对象必须时没有修改过的!如下代码所示:

    //简单地重新持久化
session.buildLockRequest(LockOptions.NONE).lock(news);
//先检查持久化对象的版本,然后重新持久化该对象
session.buildLockRequest(LockOptions.READ).lock(person);
//先检查持久化对象的版本,然后使用SELECT...FOR UPDATE重新持久化该对象
session.buildLockRequest(new LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(teacher);

啦啦啦

啦啦啦

5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法的更多相关文章

  1. 5 -- Hibernate的基本用法 --4 1 创建Configuration对象

    org.hibernate.cfg.Configuration实例代表了应用程序到SQL数据库的配置信息,Configuration对象提供了一个buildSessionFactory()方法,该方法 ...

  2. Winform CheckBox组,先横向排列,后纵向排列,点击文字,改变Checkbox的状态的方法

      开始选用的CheckedListBox控件,不能实现,改为使用ListView控件,可以满足需求.操作步骤如下: 1.将ListView的属性View改为SmallIcon. 2.CheckBox ...

  3. 5 -- Hibernate的基本用法 --2 2 Hibernate的数据库操作

    在所有的ORM框架中有一个非常重要的媒介 : PO(持久化对象:Persistent Object).持久化对象的作用是完成持久化操作,简单地说,通过该对象可对数据执行增.删.改的操作 ------ ...

  4. 【Hibernate步步为营】--核心对象+持久对象全析(三)

    上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...

  5. Hibernate.initialize(Obj)用法

    导读:  在使用hibernate进行持久化时,有时需要动态的改变对象的加载,比如在编辑页面里面lazy=true,而在浏览页面lazy=false,这样可以在需要lazy的地方才进行控制.而配置文件 ...

  6. 5 -- Hibernate的基本用法 -- 要点

    Hibernate的基本用法 ⊙ ORM的基本知识 ⊙ ORM和Hibernate的关系 ⊙ Hibernate的基本映射思想 ⊙ Hibernate入门知识 ⊙ 使用Eclipse开发Hiberna ...

  7. 5 -- Hibernate的基本用法 --4 深入Hibernate配置文件

    Hibernate的持久化操作离不开SessionFactory对象,这个对象是整个数据库映射关系经过编译后的内存镜像,该对象的openSession()方法可打开Session对象.该对象通常由Co ...

  8. hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了

    hibernate中保存一个对象后再设置此对象的属性为什么不需要调用update方法了 例如session.save(user);user.setAge(20); 原因: hibernate对象的三种 ...

  9. Hibernate持久化对象状态

    在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 各自是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状 ...

随机推荐

  1. Voltage Translation for Analog to Digital Interface ADC

    Voltage Translation for Analog to Digital Interface 孕龙逻辑分析仪 ZeroPlus Logic Analyzer How to modify an ...

  2. CentOS禁止packagekit离线更新服务的办法

    以CentOs7为例,以root身份登录系统,然后执行以下命令: [root@localhost ~]# systemctl disable packagekit-offline-update.ser ...

  3. Unity3D游戏制作(三)——移动平台上的角色阴影制作

    本系列文章由 Amazonzx 编写,欢迎转载,转载请注明出处. http://blog.csdn.net/amazonzx/article/details/7973740 本文将重点介绍两种目前在移 ...

  4. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  5. JVM内存区域的划分(内存结构或者内存模型)

    JVM内存区域的划分(内存结构或者内存模型)   运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...

  6. 卸载系统自动jdk

    执行下面的代码可以看到当前各种JDK版本和配置: sudo update-alternatives --config java   卸载系统自动jdk [root@localhost soft]# r ...

  7. MYSQL 中query_cache_size小结

    1 原理    MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓 ...

  8. SQL Server 数据库基础笔记分享(下)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  9. EasyUI 的 combotree 加载数据后折叠起来,并且只允许单击子节点的写法

    $(source).combotree({ url: '', width: kuan, valueField: 'id', textField: 'text', onlyLeafCheck: true ...

  10. ASP.NET Web API(MVC API)

    ASP.NET Web API是​​一个框架,可以很容易构建达成了广泛的HTTP服务客户端,包括浏览器和移动设备.是构建RESTful应用程序的理想平台的.NET框架. 上面是微软对Web API给出 ...