session 是用来管理一数据库的任务单元
实体对象的生命周期有三种状态:
1.Transient(自由状态)
此时的实体对象和数据库中的记录无关联,只是一个普通的JavaBean。
2.Persistent(持久状态)
此时的实体对象和数据库中的记录有关联,其变更将由Hibernate固化到数据库中。该实体对象处于由Hibernate框架所管理的状态。
3.Detached(游离状态)
处于Persistent状态的对象,其对应的Session实例关闭之后,那么,此对象就处于”Detached”状态。Detached状态和Transient状态的区别在于Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象。
session.save();
session.update(); //更新 Transient 状态的实体会报错;
关注点1: 当对象为Persistent状态时,如属性值发生变化,事务提交时,即使不写update,hibernate会自动发update的SQL更新数据;
关注点2: update默认情况下会更新所有字段,如何处理只更新变化后的字段呢?
答案1:session.merga(); //合并,但这种方式会发一条查询的SQL先查出数据库的数据,再检查属性是否发生变化。如果有则发update的SQL语句更新数据;
答案2: 使用HQL语句的方式,如:
Session session = sf.getCurrentSession();
//事务开始
session.beginTransaction();
Teacher s = (Teacher) session.get(Teacher.class, 1);
s.setName("yuanzhong1");
//import org.hibernate.Query;
Query q = session.createQuery("sql");
q.executeUpdate();
//提交事务
session.getTransaction().commit();
System.out.println("== > id:"+s.getId());
session.saveOrUpdate() ; //
session.delete(); //有id的情况下才能执行,测试发现new 对象后,setId(2)后也能删除
session.load() 、session.get() ; //查询数据并返回对象,值得一提的是: 查询前会检查缓存数据是否存在,如果没有则从数据库中查询
Session session = sf.getCurrentSession();
//事务开始
session.beginTransaction();
Teacher teacher = (Teacher) session.load(Teacher.class, 1);
System.out.println("== > id:"+teacher.getName());
//提交事务
session.getTransaction().commit();
/**
load 与 get 的区别:
load方法执行后,生成是一种lazye(懒加载)代理对象,只有在被调用的时候才发SQL语句; 如果session关闭的时候调用,则会报错;
get方法则是,直接从数据库中加载,生成实体对象;
*/
session.setFlushMode( 默认为FlushMode.AUTO ) ; //正常情况下都不会使用
sesseion.flush(); // 发送SQL语句,强制同步缓存与数据库;
session.clear() ; // 强制清除缓存,不发送SQL语句