具有复合id hibernate的动态更新

时间:2014-09-23 06:12:54

标签: java sql hibernate composite-id

在休眠状态下,如果启用了动态更新,则在更新对象时,它仅为修改后的列生成查询

考虑使用组件的复合id的类。 Composite-id saveOrupdate对象。如果给定的密钥不是DB,则以其他方式添加更新对象

现在我想要的是如何合并这2个功能?例如,我有一个具有3个属性年龄,工资,地址和复合键ID和名称的类。

对于关键" 1-Mohan"我已经有年龄= 22,工资= 30000,地址= XXX的条目。现在我只想将其工资更新为40000.当我使用密钥" 1-mohan"创建一个新实例时。并且仅设置salary = 4000并且持续存在。现在记录填充了年龄和地址的空值,因为动态更新仅发生在从DB获取的对象。

有没有办法保持现有值不变,只更新给定属性而不从DB中获取对象?

1 个答案:

答案 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-updatefalse,则hibernate将通过包含所有字段来生成update查询。

 UPDATE USER_TABLE SET SALARY=?, AGE=?, ADDRESS=? 
    WHERE ID=? AND NAME=?

如果dynamic-updatetrue,则hibernate将通过仅包含我的答案中提到的update字段来生成salary查询。

 UPDATE USER_TABLE SET SALARY=? 
    WHERE ID=? AND NAME=?