POJO状态

POJO状态
Plain Ordinary Java Object简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

三种状态:

1.1. 瞬时态
创建POJO (new POJO), 对象还没有与数据库发生关系,OID没有值(主键没有值),没有被Session管理。

1.2. 持久层态
有OID(有主键),被 session管理
Session托管 (session.save();session.load()),建立session时与数据库数据有对应关系,OID有值。发送SQL先生成主键,提交事务才入库。

1.3. 游离态
有OID,不被session管理
Session关闭 (session.close()),OID有值,脱离session。

案例:
public class TypeDAO {

public void addType(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
BookTypeEntity bookTypeEntity = new BookTypeEntity();
bookTypeEntity.setTypeName("放下");
bookTypeEntity.setTypeDesc("外在的放下与内心的放下");//这个POJO对象此时就是 2.1.瞬时态

  session.save(bookTypeEntity);//这个时候,这个对象就是 持久态
  System.out.println(bookTypeEntity.getTypeId());//oid有值

  transaction.commit();
  session.close();

  System.out.println(bookTypeEntity.getTypeId());//这个时候,这个对象就是 游离态

}

public static void main(String[] args) {
TypeDAO typeDAO = new TypeDAO();
typeDAO.addType();
}

}

Hibernate特点:添加后可以立即得到主键。

注意点:修改记录后不调用更新方法update,但提交事务会自动更新数据库,不需手动调用update。即刷新一级缓存,自动执行update语句,将一级缓存的数据更新到数据库。

观察现象:快照机制(保证数据一致性)

public void updateType(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
BookTypeEntity bookTypeEntity = session.get(BookTypeEntity.class, 31L);
bookTypeEntity.setTypeName("真的放下");
// session.update(bookTypeEntity);//不调用更新也可以更新内容
transaction.commit();//提交事务后会对比
session.close();
}

下面的情况不可以:(提交事务也没有更新)

public void update1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//添加分类
BookType bookType = new BookType();
bookType.setTypeId(39L);
bookType.setTypeName("不跑路");
bookType.setTypeDesc("努力开发");
// session.update(bookType);
transaction.commit();
session.close();
}

这种情况的对象没有被session管理,不属于持久化的状态中,不在一级缓存中。
添加也是类似的情况:

public void add1() {
Session session = HibernateUtils.openSession();
// Transaction transaction = session.beginTransaction();
//添加分类
BookType bookType = new BookType();
bookType.setTypeName("不跑路");
bookType.setTypeDesc("努力开发");
session.save(bookType);
System.out.println(bookType.getTypeId());
// transaction.commit();
session.close();
}

使用 session后没有提交事务也入库了。(此时数据在一级缓存)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • layout: posttitle: hibernatesubtitle: 用法date: ...
    虫儿飞ZLEI阅读 338评论 0 1
  • 本文包括:1、Hibernate的持久化类2、Hibernate 持久化对象的三个状态(难点)3、Hibernat...
    廖少少阅读 1,502评论 0 13
  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,346评论 0 38
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 2,016评论 0 27
  • 赶 集 老伴赶集买菜, 瓜两元桃五块。 递给五十元, 找回四十五块, 不对! 不对! 瓜钱还没算。'
    贯华阅读 453评论 5 8