Hibernate中对象有三种状态:瞬时态、持久化态、脱管态。
A 没OID,不在session管理范围内。
B 也称自由态或临时态,一般指我们new出来的对象,不存在OID,与Hibernate无关联,在数据库中无记录。
C 使用后,会被JVM直接回收,只是用于信息携带。
save() 不应该理解为保存,而应该理解为将瞬时态转换成持久态的方法。
主键自增:执行save方法时,为了将对象转换为持久化态,必须生成id值。所以需要执行insert语句生成。
saveOrUpdate() 无脑将对象状态转换为持久化状态
可手动设置OID,但不建议这样做:
Demo:
public class HibernateTest {
@Test
public void test() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
Customer c = new Customer();
c.setName(“张三”);
c.setSex(“男”);
c.setId(7); // 瞬时 ——> 脱管
}
}
A 有OID,由session管理
B 在事务未提交之前一直是持久态,当它发生改变时,Hibernate可以检测到,在数据库中可能有,也可能没有。
C 持久化态对象的任何变化都会自动同步到数据库中。
delete()
操作后相当于数据库里面就没有该记录了,被删除后的持久化对象不再建议使用。
session本身有缓存,就是一级缓存
A evict:清除一级缓存中指定的一个对象
B clear:清空一级缓存
C 关闭,即清空一级缓存
4. Demo
public void test() {
1.获得session
Session session =HibernateUtils.openSession();
2.控制事务
Transaction tx = session.beginTransaction();
3.执行操作
Customer c = session.get(Customer.class, 1L);持久化对象,session管理,有id
c.setCust_name("小红帽");
4.提交事务,关闭资源
tx.commit();
session.close(); 托管态,有id,不在session管理范围内
}
A 有OID,不在session管理范围内
B 也叫游离态或离线态,它是指持久态对象失去了与Session的关联,脱管态对象存在OID。
C 在数据库中有可能存在,也有可能不存在。
D 发生改变时Hibernet不能检测到。
直接将OID删除(不建议这样做,我们不建议操作脱管态的对象)。
public class HibernateTest {
@Test
public void test() {
Session session = HibernateUtils.openSession();
session.beginTransaction();
Customer c = new Customer();
c.setName(“张三”);
c.setSex(“男”);
c.setId(7); //瞬时态 ——> 脱管态
c.setId(null); //脱管态 ——> 瞬时态
}
}
public void test() {
1.获得session
Session session =HibernateUtils.openSession();
2.控制事务
Transaction tx = session.beginTransaction();
3.执行操作
Customer c = new Customer(); 瞬时态 没有id,没有与session关联
c.setCust_name(“小红”); 瞬时态
session.save(c); 持久化态,有id,关联session
4.提交事务,关闭资源
tx.commit();
session.close(); 托管态,有id,没有关联session
}
将我们希望同步到数据库的数据,对应的对象转换为持久化状态。
saveOrUpdate()方法:无脑将对象状态转换为持久化状态。