各位,大家好。因为公司需要,所以新的项目都数据持久化层改为hibernate。对hibernate不是很熟悉。请大家帮忙看一下我的问题。
比如我在一个方法里先查询出一个A a been.
对这个对象进行一些属性修改a.setUser("XXX");
之后我再我要保存B been的一条数据到数据库。但却发现它顺便帮我update了a的刚刚那条纪录。
我发现如果我不对查出的a对象进行修改,先保存B的,然后再a.setUser("XXX"),这样就不会帮我顺便update a.
我觉得奇怪A和B是不同表的,不同的been,两个表是没有关联的。我只是想保存B的.并不想update a的对象。但hibernate却做了update。
请问这是什么原因呢?谢谢

解决方案 »

  1.   

    这与事务提交的时机有关  查出的对象会交给Session的一级缓存管理 在这个缓存里的对象Hibernate 会自动与数据库保存同步 所以提交事务之前对对象的修改都能体现在数据库中  事务提交后 对象就不归Session管理了
      

  2.   

    谢谢你的回复。
    我看到一些资料说当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。
    Session为应用程序提供了两个管理缓存的方法:
    evict(Object obj):从缓存中清除参数指定的持久化对象。
    clear():清空缓存中所有持久化对象。
    这样说的话是不是我在查出bean后然后要进行evict(Object obj)或者
    clear()呢?
      

  3.   

    回2楼:
    用hibernate时要重点关注它的transaction,在transaction内应迅速完成任务,不做无意义的事情,一般不需要调用evict或者clear。既然你不想将对象属性的改变保存到数据库,为什么还要改变它呢,建议考虑用其它方法达到目的。 
      

  4.   

    你这样说也有道理。只样的话在同一个地方的时候,就要避开这样情况了。看来还是我的hibernate基础不够,因为时间紧迫,哈哈,谢了。