试验目的:
更新数据库中某一字段,其余字段不变。
(1)使用Update()方法
查阅Hibernate API(Hibernate_3.2.0_Reference_zh_CN.chm)得到Update()方法有:
update(Object object)
update(Object object, Serializable id)
update(String entityName, Object object)
update(String entityName, Object object, Serializable id)
很不幸运的事我的MyEclipse中只有一下方法(我用的是hibernate3.3.2,比API版本要高...我表示无语)
update(Object object)
update(String entityName, Object object)
测试代码:
Teacher teacher = new Teacher();
teacher.setId(4);
teacher.setName("Marry");
teacher.setBirthDate(new Date());
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
session.update(teacher);
session.getTransaction().commit();
_Teacher
set
birthDate=?,
name=?,
title=?
where
id=?
数据库中结果:
4 | 2011-04-13 19:52:52 | Marry | NULL
结论:使用Update()方法来更新数据得到的是数据对象的整体更新,不存在保留未修改选项,此方法不符合要求。
(2)使用Persistence 来更新
代码:
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
teacher = (Teacher)session.get(Teacher.class, 5);
teacher.setName("Marry");
session.getTransaction().commit();
生成SQL语句
update
_Teacher
set
birthDate=?,
name=?,
title=?
where
id=?
数据库显示结果:
5 | 2011-04-13 08:22:21 | Marrys | XX
结论:数据库中只修改了某一字段值,其余没有改变,符合要求。
(3) 延伸一下问题,若是使用persistence 来更新数据中的对象信息时Hibernate会发送全部字段的更新信息,有时候会降低效率,若是只发送需要修改的某一字段的信息?
HQL语句 : Hibernate Quary Language 是Hibernate使用的面向对象的数据查询语言。
代码:
Teacher teacher = new Teacher();
SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sf.getCurrentSession();
session.beginTransaction();
Query query = session.createQuery("update Teacher t set t.name='Toms' where t.id=5");
query.executeUpdate();
session.getTransaction().commit();
Hibernate产生SQL语句:
update
_Teacher
set
name='Toms'
where
id=5
数据显示结果:
5 | 2011-04-13 08:22:21 | Toms | XX
结论:该方法同样可以满足实验要求,同时又能做到执行时候只发送需要修改字段的SQL语句,同时有使用到了HQL面向对象的语句,这种方法在项目中比较常用,是解决Update的首选方法。