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

Java 使用复合id hibernate进行动态更新,java,sql,hibernate,composite-id,Java,Sql,Hibernate,Composite Id,在hibernate中,如果启用了动态更新,则在更新对象时,它只为修改过的列生成查询 考虑一个使用组件的具有复合id的类。复合id保存或更新对象。如果给定的键不是DB,它会添加或更新对象 现在我想要的是如何合并这两个功能?例如,我有一个类,它有3个属性:年龄、薪水、地址和一个复合键id和名称 对于键1-Mohan,我已经有了年龄=22、工资=30000、地址=XXX的条目。现在我只想把它的薪水提高到4万英镑。当我使用键1-mohan创建一个新实例,并将其设置为仅salary=4000并保持不变时

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

考虑一个使用组件的具有复合id的类。复合id保存或更新对象。如果给定的键不是DB,它会添加或更新对象

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

对于键1-Mohan,我已经有了年龄=22、工资=30000、地址=XXX的条目。现在我只想把它的薪水提高到4万英镑。当我使用键1-mohan创建一个新实例,并将其设置为仅salary=4000并保持不变时。现在,记录填充年龄和地址的空值,因为动态更新只发生在从数据库获取的对象上

是否有任何方法可以保持其现有值不变并仅更新给定属性而不从DB获取对象???

将dynamic update设置为true不会为其他字段设置空值,相反,它只会更新已修改的字段

例如,在您的示例中,hibernate生成的查询如下所示:

 UPDATE USER_TABLE SET SALARY=? 
    WHERE ID=? AND NAME=?
因此,它不会为其他字段设置空值

更新:

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

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

如果动态更新为false,则hibernate将通过包含所有字段来生成更新查询

 UPDATE USER_TABLE SET SALARY=?, AGE=?, ADDRESS=? 
    WHERE ID=? AND NAME=?
如果动态更新为true,那么hibernate将通过只包括我在回答中提到的salary字段来生成更新查询

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

是的,我知道。但我的问题是,当我们使用带有复合id的动态更新时。在这种情况下,我们只创建新对象并为saveOrupdate@MohanRajB,我不清楚你想说什么,如果您正在创建新对象并仅设置salery字段,则hibernate将为所有其他属性设置空值,即使您没有dymaic更新,也没有问题,对吗?是的,您是对的。我正在用一个键创建新对象,在DB中已经存在一个具有相同键复合id的对象。现在,由于它使用复合id,它将调用saveorupdate并更新现有行,这将使除我已更新的字段之外的所有其他字段都为空。我希望这些字段在此更新过程中保持其原始值不变。但是请看我的问题是,有没有办法保持其现有值不变,只更新给定的属性,而不从DB???@MohanRajB获取对象,如果您只想更新少数字段,那么您应该使用HQL或原生SQL,在那里您可以指定应该对DB运行的确切查询。如果您试图保存/更新完整的实体而不设置某些字段,那么您是在告诉hibernate您希望将这些字段设置为null,这样就不可能通过保留某些字段的先前状态来保存实体。