2014-09-23 74 views
1

在休眠,如果动态更新使能,而更新它仅用于改性列复合ID动态更新休眠

生成查询对象考虑具有复合-ID使用组件的类。 Composite-id saveOrupdate对象。如果给定的密钥不是数据库,则会添加更新对象

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

对于关键的“1-Mohan”,我已经有了年龄= 22,工资= 30000,地址= XXX的条目。现在我只想将薪水更新为40000.当我使用“1-mohan”关键字创建新实例并设置salary = 4000并且持续存在时。现在该记录填充年龄和地址的空值,因为动态更新只发生在从数据库中获取的对象上。

是否有任何方法来保持其现有值不变,只更新给定的属性而不从DB中获取对象?

回答

0

设置dynamic-updatetrue将不会为其他字段设置null值,而只是更新修改的字段。

例如,在您的例子由Hibernate生成的查询将是这样的:

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

所以它是不会对其他领域设置null值。

更新:

现在根据你的解释在注释中的问题与dynamic-update没有关系。

您需要做的是首先使用Session.get根据composite-id获取对象。现在你的对象将会设置所有的字段。现在更新salary字段,然后调用saveOrUpdate方法。

如果dynamic-updatefalse那么休眠将通过包括所有字段生成update查询。

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

如果dynamic-updatetrue则Hibernate会在我的答复中提到,包括只有salary领域产生update查询。

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

是的,我知道。但我的问题是,当我们使用composite-id进行动态更新时。在这种情况下,我们只创建一个新的对象,并给出saveOrupdate – 2014-09-23 06:52:38

+0

@MohanRajB,我不清楚你想说什么,如果你正在创建一个新的对象并设置'salery'字段,那么hibernate会设置'null'值为所有其他属性,即使你没有'dymaic-update'那么没有问题吗? – Chaitanya 2014-09-23 06:59:36

+0

是的,你是对的。我用一个键创建新对象,在DB中存在一个已经具有相同键的对象(composite-id)。现在,由于它使用的是复合标识符,它将调用saveorupdate并更新现有的行,除了已更新的字段外,它将使所有其他字段为空。我希望那些不会更改的字段在此更新期间保留其原始值 – 2014-09-23 07:14:16