最近在做项目的时候,框架是SSH搭建的,发现一问题,请看如下列子:
GuEndorRiskDto guTempRiskDto= guEndorRiskDao.findByPrimaryKey(endorNo, planCode, riskCode);
guTempRiskDto.setStartDate("2012-02-22");
guTempRiskDto.setEndDate(("2013-02-21");
......
然后guTempRiskDto对象也没有进行其它的操作,那么当事务结束后数据库里面的startDate值会变成什么呢?
答案是:2012-02-22
虽然我们没有对取出来的对象进行过任何的update操作,而仅仅是对取出来的对象重新赋值,但当整个事务结束后,hibernate会动态更新你赋的新值到数据库.
之前我也挺纳闷,后来通过网上资料的查看和个人的经验总结,发现这是hibernate的一个机制:
当查询和赋值同时在一个相同的session中进行时,hibernate根据id判断是否为同一个对象,如果是,则会自动更新相应的属性值.
这样做的初衷是为了提高效率,当然我们也可以手动设定不让其自动更新,我们可以在映射文件相应属性中设置update="false"可以不用更新该字段
或者是在映射文件中的class标签里面加上:dynamic-insert="false"
就像下边这样:
<class name="com.sinosoft.XXDtoo" table="xxx"
dynamic-update="false"
dynamic-insert="true"
optimistic-lock="version">
撰写此文,作为经验备忘