java - 使用复合 id hibernate 进行动态更新

标签 java sql hibernate composite-id

在 hibernate 中,如果启用动态更新,则在更新对象时,它仅生成针对修改列的查询

考虑一个使用组件的具有composite-id 的类。 Composite-id 保存或更新对象。如果给定的键不是 DB,则添加,否则更新对象

现在我想要的是如何合并这两个功能?例如,我有一个具有 3 个属性年龄、薪水、地址以及复合键 id 和名称的类。

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

有什么方法可以保留其现有值不变并仅更新给定属性而不从数据库中获取对象吗?

最佳答案

dynamic-update设置为true不会为其他字段设置null值,而只会更新被修改的字段。

例如,在您的示例中,hibernate 生成的查询将类似于:

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

因此它不会为其他字段设置 null 值。

更新:

现在根据您在评论中的解释,该问题与动态更新无关。

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

如果dynamic-updatefalse,那么hibernate将通过包含所有字段来生成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=?

关于java - 使用复合 id hibernate 进行动态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25988055/

相关文章:

c# - 将 SqlDataType 转换为 C# 枚举

java - 使用 "pure"Hibernate/JPA 一次更新唯一列中的多个条目

java - 错误: MainActivity is not abstract and does not override abstract method onClick(View) in OnClickListener

java - 使用自定义排序规则对 int(非整数)数组进行排序

java - 模板方法模式 - 命名约定

Python:为什么我的数据库不显示在这个窗口中?

mysql - 改成varchar

java - 如何配置 Maven 以使用 servlet 3

java - hibernate和Sybase错误

java - 如何将大型 Java 应用程序分解为组件?