分类
对象状态分为三种:瞬时状态,持久化状态,游离|托管状态
瞬时状态
没有与数据库中对应的id,没有session关联.
持久化状态
有与数据库中对应的id,有session关联
游离|托管状态
有与数据库中对应的id,没有session关联
问:这里假如我们new了一个对象,然后指定了id,那是瞬时状态还是游离状态呢?
首先,我们应该确认id是不是与数据库对应,如果数据库中的id是1,而指定的id是2,则是瞬时状态,如果是与数据库中对应的id则是游离状态
使用以下的test类来说明:
public void func1(){
// 读取配置
Configuration conf = new Configuration().configure();
// 创建session
SessionFactory sessionFactory = conf.buildSessionFactory();
// 获得事务操作对象,进行CUDR
Session session = sessionFactory.openSession();
// 控制事务
Transaction tx = session.beginTransaction();
//-----------------------
// 创建一个实体类,没有id,没有关联session(瞬时状态)
Customer c = new Customer();
// 为实体类属性添加值,没有id,没有关联session(瞬时状态)
c.setCust_name("刘先生");
// 将实体类与session关联,并通过insert语句添加了id(持久化状态)
session.save(c);
tx.commit();
// -----------------------
// session关闭,持久化的实体类与session失去关联,但是有id(游离状态)
session.close();
sessionFactory.close();
}
通过,以上可知.CUDR的C(增加)是将数据从瞬时状态转化为持久化状态,而当close()方法的执行时,由持久化转为游离状态.
那么,如何从游离状态变为持久化状态呢?持久化状态转为瞬时状态呢?看下图!
上图,为CURD都说明了功能,也可以说,我们数据库操作的目的主要就是为了数据持久化.
另外,hibernate为我们提供了saveOrUpdate()方法,无脑将对象持久化