Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅更新hibernate中对象的非空字段_Java_Mysql_Spring_Hibernate - Fatal编程技术网

Java 仅更新hibernate中对象的非空字段

Java 仅更新hibernate中对象的非空字段,java,mysql,spring,hibernate,Java,Mysql,Spring,Hibernate,我有一个用例,其中包含表主键的持久对象的更新字段很少。在这种情况下,我只想用这些字段更新行。我发现hibernate没有提供任何现成的解决方案,所以我自己编写了一个方法,使用反射来确定对象的所有非空字段,并基于此创建一个更新查询并最终执行它。我的应用程序是使用spring框架编写的。到目前为止,我的做法是,我有一个单独的util类,它有一个更新方法,该方法接受会话对象、主键、主键值和表名。这是实现这个用例的好方法吗?有什么更好的建议吗?我不清楚你的问题。对于更新,您可以进行选择,然后保存它。或者

我有一个用例,其中包含表主键的持久对象的更新字段很少。在这种情况下,我只想用这些字段更新行。我发现hibernate没有提供任何现成的解决方案,所以我自己编写了一个方法,使用反射来确定对象的所有非空字段,并基于此创建一个更新查询并最终执行它。我的应用程序是使用spring框架编写的。到目前为止,我的做法是,我有一个单独的util类,它有一个更新方法,该方法接受会话对象、主键、主键值和表名。这是实现这个用例的好方法吗?有什么更好的建议吗?

我不清楚你的问题。对于更新,您可以进行选择,然后保存它。或者只是创建实体并保存它(这里主键是必需的)。因为您想要更新,所以可以使用第一种方法。无需在此处讨论必填字段。

大多数情况下,导致在要持久化的实体的可空字段中保存默认值的原因之一是,因为在实体的POJO中使用了原始数据类型。
请检查您是否未使用任何原语。如果是,则切换到相应的包装器类,然后保存。保存或更新后,提交时应将null传递给数据库。

希望这能解决您的问题:)

您的解决方案将导致执行两个查询:首先选择,然后更新。我希望在一个查询本身中进行更新。这就是我这样做的原因。您可以将所有非空值传递给构造函数。因此,只有在所有非空字段都有值的情况下,才能创建持久性对象。如果我只想更新firstname,我会创建一个只有firstname和id的user对象。现在如果我执行session.saveorupdate(user),那么lastname和middlename将在数据库中设置为null。这不是我想要的。我只想更新数据库中的firstname,保持lastname和middlename不变。为此,可以使用HQL或Hibernate条件。如果firstname、lastname或middlename中的任何一个都有值,那么它将被更新。您能解释一下我给出的上述示例吗?如何使用hibernate标准来实现这一点?