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

啦啦啦

 

啦啦啦