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后没有提交事务也入库了。(此时数据在一级缓存)