方式一:
使用hibernate的缓存和快照机制,
hibernate 向一级缓存放入数据时,同时保存快照数据 ( 数据库备份 ) ,当修改一级缓存数据,在 flush 操作时,对比缓存和快照,如果不一致,自动更新 ( 将缓存的内容同步到数据库,更新快照 ).
/**
2. * 测试快照区的使用
3. */
4. @Test
5. public void demo() {
6. // 获得 Session
7. Session session = HibernateUtils.openSession();
8. // 开启事务
9. Transaction transaction = session.beginTransaction();
10. // 查询 id 为 1 的图书对象
11. Book book = (Book) session.get(Book.class, 1); // 第一次查询,将对象加入一级缓存
12. System.out.println(book);
13. book.setName(" 深入浅出 Hibernate 技术 "); // 修改书名(一级缓存被修改,自动 update )
14. // 没有手动执行 update ,因为快照区原因,自动更新
15. // 提交事务,关闭 Session
16. transaction.commit();
17. session.close();
18.
方式二:
使用hibernate的update()方法
使用该方法有一个问题就是会修改对象中的所有字段,当我们表中有字段是文本类型,这个类型存储的内容是几千,几万字,这样效率会很低.(当然如果一定要使用该方式,也有解决方案,可自行百度)
1. @Test
2. public void update(){
3. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
4. session.beginTransaction();
5. Teacher t = (Teacher) session.get(Teacher.class, 3);
6. t.setName("张老师");
7. session.update(t);
8. session.getTransaction().commit();
}
方式三:
使用 HQL 语句 executeUpdate()
1. public void update(){
2. Session session = HibernateUitl.getSessionFactory().getCurrentSession();
3. session.beginTransaction();
4. Query query = session.createQuery("update Teacher t set t.name ='n' where id = 3");
6. query.executeUpdate();
7. session.getTransaction().commit();
8. }