2013-10-26 49 views
1

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

+0

为什么你只想更新这些字段? – 2013-10-26 10:03:34

回答

0

你的问题不清楚给我。为了更新,你可以做一个选择,然后保存它。或者只是创建该实体并保存它(主键在这里是必需的)。既然你想更新,你可以使用第一种方法。这里不需要打扰强制性领域。

+0

您的解决方案将导致执行2个查询:首先选择然后更新。我想在一个查询本身做更新。这就是我这样做的原因。 – coder

+0

您可以将所有非空值传递给构造函数。因此,只有在所有非空字段都具有值的情况下,才能创建持久性对象。 – MadhavC

+0

可以说我有一个用户类,它的名字,姓氏和中间名,ID作为字段。如果我只想更新名字,我会用firstname和id创建用户对象。现在,如果我执行session.saveorupdate(用户),则姓名和中间名将在数据库中设置为空。这不是我想要的。我想只更新db中的名字,因为它保持姓和中间名。 – coder

0

由于在实体的POJO中使用了原始数据类型,因此大多数时间导致将实体的可空字段中的默认值保存为持久的原因之一。
请检查你是否没有使用任何基元。如果是切换到相应的包装类,然后保存。保存或更新后,它应该将null传递给数据库。
希望这可以解决您的问题:)