公司使用Struts + Spring + Hibernate的框架开发项目,但在最近的开发中发现,每当查询数据时,hibernate都会Update所查询的内容,一开始以为是项目中在 Web服务器启动时查询出的那些静态信息造成的,因为大家到知道的,hibernate通过使用Update来持久化游离对象,我最初的想法是在Web服 务器启动时,通过hibernate加载的那些静态信息,用于在hibernate的缓存中有对应的OID,会定期的进行Update,但后来经过我将那 些静态信息去掉,发现问题依然存在,可见不是这静态信息的原因,这就奇怪了,在前一个项目中也是使用的是这个框架,但是并没有出现这个问题,通过对比了一 下两个项目的配置,虽然在一些细节上不尽相同之外,并没有什么区别,问了问当时参加培训时我的老师,他说他也遇到过这个问题,但是忘了怎么解决的了,当时 我就郁闷了。后来通过伟大的Internet,看到有高人说是因为在持久化类的setter/getter方法中设置空字符串等的默认值的原因。通过实 验,果然使这个原因。
    原来如果在setter/getter方法中设置空字符串的默认值,我设置的是“”,hibernate取出来时还是会将空字符串设置为null,由于人 为的将null设置成“”,就相当于在取出值的同时,对该null字段进行了赋值,这就造成了缓存中的持久化对象与数据库对象的不一 致,hibernate会以为该持久化对象已被改变,因此才Update。
    由于Hibernate是通过setter/getter方法对对象的属性进行赋值,因此,为了避免这种Update的情况出现,不要在setter/getter方法中赋值,而采用在属性定义时或构造函数中赋上默认值。
    由于hibernate的原因,对空字符串对象即使赋予“”值,hibernate在从数据库中取出该空值对象时,也会将其设置为空。