• 5 -- Hibernate的基本用法 --5 3 改变持久对象状态的方法


      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);

    啦啦啦

    啦啦啦

  • 相关阅读:
    Java基础学习总结(33)——Java8 十大新特性详解
    Java基础学习总结(33)——Java8 十大新特性详解
    RabbitMQ学习总结(6)——消息的路由分发机制详解
    RabbitMQ学习总结(6)——消息的路由分发机制详解
    Stanford公开课《编译原理》学习笔记(1~4课)
    补习系列(21)-SpringBoot初始化之7招式
    使用modelarts部署bert命名实体识别模型
    全面认识 RUST -- 掌控未来的雷电
    补习系列(20)-大话 WebSocket 与 "尬聊"的实现
    【开发者portal在线开发插件系列二】多条上下行消息(messageId的使用)
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/7499864.html
Copyright © 2020-2023  润新知