Hibernate学习笔记---Transient、Persistent、Detached三个状态

Transient、Persistent、Detached是Hibernate三个核心的状态:
---------------------------------------------------------------------------
Transient状态最大的特征是:
          * 在数据库中没有与之匹配的数据
          * 没有纳入session的管理

Persistent状态最大的特征是:
          * 在数据库中有与之匹配的数据
          * 纳入了session的管理
          * 在清理缓存(脏数据检查)的时候,会和数据库同步

Detached状态最大的特征是:
          * 在数据库中有与之匹配的数据
          * 没有纳入session的管理
---------------------------------------------------------------------------


如下面的两个图(中英文对照)


Hibernate学习笔记---Transient、Persistent、Detached三个状态_第1张图片
 
Hibernate学习笔记---Transient、Persistent、Detached三个状态_第2张图片
 


以下是一段用于说明这三个状态的代码:

package com.ahuzl.hibernate;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.Transaction;
import junit.framework.TestCase;

public class SessionTest extends TestCase {

    public
void testSession(){
        Session session =
null;
        Transaction tx =
null;
        User user =
null;
        try
{
            session = HibernateUtils.getSession();
            tx = session.beginTransaction();

            //Transient状态,临时状态,一经save就会转变到Persistent状态

            user =
new User();
            user.setName(
"
中田");
            user.setPassword(
"nakada");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());

            //Persistent状态,持久化状态(数据库中有相同的值与之对应),当属性发生改变时,hibernate会自动与数据库同步,不需要update

            session.save(user);
            user.setName(
"
幸島");
            tx.commit();
        }
catch (Exception e){
            e.printStackTrace();
            tx.rollback();
        }
finally {
            HibernateUtils.closeSession(session);
        }

        //Detached状态,游离状态,session关闭之后,便由persistent状态变为Detached状态

         try
{
            session = HibernateUtils.getSession();
            session.beginTransaction();
            user.setName(
"
幸島");
            //在Detached状态下,更新对象的属性,需要update才能反映到数据库
            session.update(user);
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }
    }
}

hibernate annotation 的实体类中如果存在数据库中没有的字段,需要在这个字段中加上@Transient注释

你可能感兴趣的:(Hibernate学习笔记---Transient、Persistent、Detached三个状态)