在休眠状态下,如果启用了动态更新,则在更新对象时,它仅为修改后的列生成查询
考虑使用组件的复合id的类。 Composite-id saveOrupdate对象。如果给定的密钥不是DB,则以其他方式添加更新对象
现在我想要的是如何合并这2个功能?例如,我有一个具有3个属性年龄,工资,地址和复合键ID和名称的类。
对于关键" 1-Mohan"我已经有年龄= 22,工资= 30000,地址= XXX的条目。现在我只想将其工资更新为40000.当我使用密钥" 1-mohan"创建一个新实例时。并且仅设置salary = 4000并且持续存在。现在记录填充了年龄和地址的空值,因为动态更新仅发生在从DB获取的对象。
有没有办法保持现有值不变,只更新给定属性而不从DB中获取对象?
答案 0 :(得分:0)
将dynamic-update
设置为true
不会为其他字段设置null
值,而只会更新已修改的字段。
例如,在您的示例中,hibernate生成的查询将类似于:
UPDATE USER_TABLE SET SALARY=?
WHERE ID=? AND NAME=?
因此,它不会为其他字段设置null
值。
<强>更新强>
现在根据您在评论中的解释,该问题与dynamic-update
无关。
您需要做的是首先使用Session.get
根据composite-id
获取对象。现在您的对象将设置所有字段。现在更新salary
字段,然后调用saveOrUpdate
方法。
如果dynamic-update
为false
,则hibernate将通过包含所有字段来生成update
查询。
UPDATE USER_TABLE SET SALARY=?, AGE=?, ADDRESS=?
WHERE ID=? AND NAME=?
如果dynamic-update
为true
,则hibernate将通过仅包含我的答案中提到的update
字段来生成salary
查询。
UPDATE USER_TABLE SET SALARY=?
WHERE ID=? AND NAME=?