当前位置: 首页> 学习园地

新mg电子游戏手机版实训-Hibernate对象状态和一对多关系的实现-三种状态的转换-哈尔Java培训

2018-08-16 16:43:37更新

 

案例:

/**

 * 对象的三种状态的转换

 *

 * 1.瞬时态==>持久态

 * 2.瞬时态==>游离态

 *

 * 3.持久态==>瞬时态

 * 4.持久态==>游离态

 *

 * 5.游离态==>瞬时态

 * 6.游离态==>持久态

 *

 */

public class Test02 {

 

@Test

public void Test01() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

 

// --------------------------------------------------------

ts.commit();

session.close();

}

 

// 1.瞬时态==>持久态

@Test

public void Test03() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

User u = new User(); // 1.瞬时态

u.setName("tom"); // 1.瞬时态

u.setPassword("1234"); // 1.瞬时态

session.save(u); // 2.持久态

// 1.save方法会使用主键生成策略(native),为user指定id,

// 因为目前使用Mysql语句,主键自增的策略,会打印insert语句

// 在此处加上一个断点调试一下。

// 2.如果主键生成策略是increment的策略,由hibernate维护主键的增长

// 运行到此处时,会先执行select语句,查出最max(id)

// 在下面ts.commit的时候打印insert--事务提交时,会把持久化状态的对象,保存到数据库中

// 总结:save方法的作用,目的,其实是在获得主键

// 3.如果主键生成策略是assigned的策略,是由我们维护主键,运行到此处,没有主键,会报错!!!

// --------------------------------------------------------

ts.commit();

session.close();

}

 

 

// 2.瞬时态==>游离态

// 瞬时:没有关联,没有id

// 游离:没有关联,有id(与数据库中对应的id)

@Test

public void Test04() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

User u = new User(); // 瞬时态

// u.setId(1000000); -- 数据库中没有这个id

u.setId(1); // 游离态,数据库中有id为1的记录

// --------------------------------------------------------

ts.commit();

session.close();

}

 

// 3.1.持久态==>瞬时态

// 持久:有关联,有id

// 瞬时:无关联,无id

@Test

public void Test05() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

// 通过get方法得到一个持久状态的对象

User u = (User) session.get(User.class, 1); // 持久态

 

// --------------------------------------------------------

ts.commit();

session.close();

u.setId(null); // 瞬时态

}

 

// 3.2.持久态==>瞬时态: 用session.evict(u)方法

// 持久:有关联,有id

// 瞬时:无关联,无id

@Test

public void Test06() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

// 通过get方法得到一个持久状态的对象

User u = (User) session.get(User.class, 1); // 持久态

 

// 在没有关闭session的状态下,将user对象与session的关联移除

session.evict(u); // 游离态

u.setId(null); // 瞬时状态,没有OID了

 

// 怎么证明u对象被移除了,调用save方法,会产生一个新id的数据

session.save(u);

// --------------------------------------------------------

ts.commit();

session.close();

}

 

// 4.持久态==>游离态

// 只需要将session的关联取消就可以了

@Test

public void Test07() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

// 通过get方法得到一个持久状态的对象

User u = (User) session.get(User.class, 1); // 持久态

 

// 在没有关闭session的状态下,将user对象与session的关联移除

session.evict(u); // 游离态

u.setId(null); // 瞬时状态

 

session.save(u); // 持久态

// --------------------------------------------------------

ts.commit();

session.close(); // 游离态

}

 

// 5.游离态==>瞬时态

// 只要移除id即可

@Test

public void Test08() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

// 通过get方法得到一个持久状态的对象

User u = (User) session.get(User.class, 1); // 持久态

 

// 在没有关闭session的状态下,将user对象与session的关联移除

session.evict(u); // 游离态

u.setId(null); // 瞬时状态

 

// --------------------------------------------------------

ts.commit();

session.close();

}

 

// 6.游离态==>持久态

//是否与session关联

@Test

public void Test09() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

          

// 通过get方法得到一个持久状态的对象

User u = (User) session.get(User.class, 1); // 持久态

 

    // 在没有关闭session的状态下,将user对象与session的关联移除

    session.evict(u); // 游离态

session.update(u);  //持久态

 

// --------------------------------------------------------

ts.commit();

session.close();

}

 

//三种状态有什么用

//1.三种状态最重要的状态是持久态,使用hibernate最终是为了持久化状态,

//我们期望同步到数据库中的对象都转化为持久状态

//2.持久化状态的特点:hibernate会★自动★将持久化对象的状态★同步★到数据库中

 

 

//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

@Test

public void Test10() {

Session session = HibernateUtil.openSession();

Transaction ts = session.beginTransaction();

// --------------------------------------------------------

        User u = (User)session.get(User.class, 1); //持久态

        u.setName("jerry");    //还是持久态,设置断点,查看一下运行结果

        

        //u.setId(3);  -- 与session建立关联对象的id不允许修改

        // session.update(u);  --多于代码,原因:hibernate会★自动★将持久化对象的状态★同步★到数据库中

        // --------------------------------------------------------

ts.commit();    //程序运行到此处,在没有执行save的方法的情况,居然执行了update语句

session.close();

}

}