当前位置: 首页 > 面试题库 >

休眠:脏检查并且仅更新脏属性?

狄誉
2023-03-14
问题内容

在“旧的JDBC美好时光”中,我编写了许多SQL代码,这些代码仅针对实际更改的“属性/成员”进行了针对性的更新:

例如,考虑具有以下成员的对象:

public String name;
public String address;
public Date date;

如果仅date在某些业务方法中进行了更改,我将只UPDATE为该date成员发出一个SQL 。

但是,似乎(这是我对Hibernate的“印象”)在使用标准Hibernate映射(映射完整类)时,即使仅单个成员的更新也将导致由Hibernate生成的SQL语句中对象的完整更新。

我的问题是:

  1. 这种观察是正确的吗,Hibernate 不会 智能地检查(在完全映射的类中)更改了哪些成员,然后仅发布特定已更改成员的更新,而始终会进行更新(在生成的SQL Update语句中)所有(类的)映射成员,即使它们没有更改(如果对象由于一个成员变脏而变脏了……)

  2. 如何使Hibernate仅更新已更改的那些成员?我正在寻找让Hibernate仅更新实际更改的成员的解决方案。

(我知道Hibernate在脏检查方面做了很多工作,但据我所知,这种脏检查仅与确定对象整体是否脏有关,而不是单个成员是否脏。)


问题答案:

其实,你可以指定的选项dynamic-update,并dynamic- insert在类的映射。它就是这样做的。更多信息在这里。



 类似资料:
  • 问题内容: 在“旧的JDBC美好时光”中,我编写了许多SQL代码,这些代码仅针对实际上已更改的“属性/成员”进行了针对性的更新: 例如,考虑具有以下成员的对象: 如果仅在某些业务方法中进行了更改,我将只为该成员发出一个SQL 。 但是,似乎(这是我对Hibernate的“印象”)在使用标准Hibernate映射(映射完整类)时,即使仅单个成员的更新也会导致Hibernate生成的SQL语句中对象的

  • 当对象变脏(已修改)时,是否有方法强制hibernate在saveOrUpdate上保存对象的新实例(新标识符)?这是否可以通过配置或拦截器实现?我有三个实体: 基本上,我希望C在创建和保存B时始终保存B的快照,而不是直接引用a引用的B实例。 B应该是可修改的,A应该指向B的最新版本。 我可以通过实现equals方法手动实现这一点,在调用saveOrUpdate()之前检查equals并在必要时将

  • 几天来我一直在想办法解决这个问题。糟糕的是,hibernate没有提供ready to use annotation来将属性排除在脏检查之外。问题是,我有一节课,如下所示

  • 本文向大家介绍AngularJS的脏检查深入分析,包括了AngularJS的脏检查深入分析的使用技巧和注意事项,需要的朋友参考一下 写在开头 关于Angular脏检查,之前没有仔细学习,只是旁听道说,Angular 会定时的进行周期性数据检查,将前台和后台数据进行比较,所以非常损耗性能。 这是大错而特错的。我甚至在新浪前端面试的时候胡说一通,现在想来真是羞愧难当! 没有深入了解就信口开河实在难堪大

  • 我在试验Eclipselink。我正在尝试更新数据库中的一个现有实体。JPA实体只有公共字段,字段使用JPA注释进行注释。代码使用加载实体。 代码创建JPA实体的实例,为实体的公共字段赋值,并调用EntityManager.merge(entity)方法。Eclipselink不更新数据库记录。我启用了log来查看Eclipselink是否发出SQL语句。 Eclipselink不发出任何upda

  • 问题内容: 我用hibernate映射的对象具有奇怪的行为。为了知道对象为何表现异常,我需要知道是什么使该对象变脏了。有人可以帮我提示吗? 该对象是Java / Spring上下文中的Java类。因此,我希望针对Java平台的答案。 编辑:我想获得对Hibernate脏状态的访问以及它如何在连接到会话的对象上更改。我不知道一段代码会对您有什么帮助。 至于实际的问题:在由Spring Transac