使用Hibernate更新表时忽略实体bean的空值

时间:2014-04-25 06:18:53

标签: java hibernate

Stuck on the same problemnull更新数据库时是否有任何忽略Hibernate值的方法?

每当你调用update();对于Session,它还将更新在对象中找到的空值。

示例:

User user = new User();
user.setUserId(5);
user.setUserName("Maarten");
user.setUserFirstName(null); // but in database this value is not null

session.update( user);

OR

session.saveOrUpdate( user);

DB现在将更新用户,但会将用户firstname设置为null(因为它在对象中为null)。

Hibernate中是否有任何方法或方法可以避免这种情况(我不想触发select / update查询来设置bean)?它将忽略空值?

3 个答案:

答案 0 :(得分:3)

hibernate-dynamic-update

  

dynamic-update属性告诉Hibernate是否在SQL UPDATE语句中包含未修改的属性。

答案 1 :(得分:0)

这取决于您希望控制的抽象级别以及对象的业务规则:

  • 字段是否真的可以为空,或者您只是将其用作DTO?也许你需要一个中间对象来控制空值
  • 新用户会怎么样(如示例所示)?我应该忽略空值,然后应该保留哪个值,默认值?

无论如何,如果您在较低级别定义您的必需品,例如"在更新查询"中不包含空值,您可以使用以下内容:

  • sql-update批注here。您可以使用自定义SQL查询或过程来控制值
  • dynamicUpdate是关于更改,而不是值,所以我认为它不适合
  • 如果需要,使用EntityListener和辅助瞬态字段还原更改。
  • 其他选项:使用interceptor甚至创建custom dialect

答案 2 :(得分:0)

选项之一是,在会话中使用load方法get(object) Bean,然后设置/更改值。但这带来了一个 extra 调用数据库的开销。 或者,如果进行额外的通话至关重要,则可以创建自定义查询。

编辑:如果bean被缓存,则get(object)不会对性能造成影响。