hibernate的实体对象分为三种状态:
- 瞬时状态Transient:不纳入session管理,数据库中没有对应记录
- 持久状态Persistent:纳入session管理,数据库中有对应记录
- 游离状态Detached:不纳入session管理,数据库中有对应记录
下面根据上图的各种状态转移展示一下代码:
瞬时->持久->游离->持久
/**
* 测试对象三种状态,解释什么操作下状态进行转换
*
* 瞬时状态Transient Objects 持久化状态Persistent Objects 离线状态Detached Objects
*/
public void test2() {
Session session = null;
User user1 = null, user2 = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 现在是Transient状态,还没有纳入session管理,数据库中也没有对应的数据
user1 = new User();
user1.setUserName("张三");
user1.setPassWd("1234567");
user2 = new User();
user2.setUserName("李四");
user2.setPassWd("1234567");
// 当save保存后,对象变为Persistent状态,纳入session管理,并且在数据库中有对应的记录
session.save(user1);
session.save(user2);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
// 当session关闭后,对象转换为Detached状态
hibernateUtil.closeSession(session);
}
// 这里开始第二个session
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 这里是Detached状态,session中没有管理,但是数据库中有对应记录
user1.setUserName("赵五");
// 显示的调用update,调用完毕之后,user1对象又变成Persistent状态
session.update(user1);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
}
load读取出来的对象,直接就是Persistent状态
/**
* 测试读取,读取出来的数据是persistent状态 load方法
*/
public void test3() {
Session session = null;
User user = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 这里读取出来一个persistent状态的实体对象
user = (User) session.load(User.class, 1);
System.out.println("用户名:" + user.getUserName());
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
}
load函数是cglib代理方式,延迟加载,在函数调用的时候返回的是代理类型,不是实体类型,target是存储真实数据的地方,刚开始是空的
这是延迟加载,在实际使用的时候取回的数据保存位置
Persistent状态转换为Transient状态
/**
* 测试一下delete方法,看看执行删除操作后,对象状态
*/
public void test4() {
Session session = null;
User user = null;
try {
session = hibernateUtil.getSession();
session.beginTransaction();
// 这里读取出来一个persistent状态的实体对象
user = (User) session.load(User.class, 1);
System.out.println("用户名:" + user.getUserName());
// 这里删除数据库中的记录
session.delete(user);
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
hibernateUtil.closeSession(session);
}
System.out.println("用户名称:" + user.getId());
}
从库里查出来,然后删除,事务提交,这个对象还是存在的,而且ID也是存在的,虽然库里面已经没有了
这里有几点需要注意的问题:
- <property name="hibernate.hbm2ddl.auto">update</property>测试的时候需要来回的调整数据的覆盖方式
- 。。。