当前位置: 首页 > 知识库问答 >
问题:

Spring Data jpa如何知道属性已更改?

华福
2023-03-14

假设我从存储库中查找一个对象。如果在查找后立即保存此对象,则Spring数据足够聪明,不会更新数据库。如果我更改此对象中的属性,然后保存,则spring数据会进行更新。它如何知道是否需要进行更新?

共有2个答案

燕英逸
2023-03-14

Spring实际上并不直接适用于您类的实例。它所做的是创建一个代理来包装实际实例并委托给它。该代理保存底层实例的持久性状态。换句话说,它知道实例是否与数据库中的状态相同,也知道它在内存中的状态。

如果您调用(某些)方法,它会认为自己很脏。EntityManager将不得不推送这些更改。如果您不这样做,那么它也知道不需要推送任何更改。

翁烨霖
2023-03-14

这不是Spring数据提供的,它是持久性框架(hibernate、openjpa、eclipselink等)的一个特性。

持久性提供程序使用一些用于优化的“东西”来增强域对象。通常,这是通过所谓的运行时增强来完成的,因此类会加载到应用程序内部并在那里得到增强(运行时编织)。

Openjpa还允许构建时增强,这意味着“Openjpa域扩展”将在编译时添加到实体中。(openjpa插件中也有maven的目标)https://openjpa.apache.org/builds/2.2.2/apache-openjpa/docs/ref_guide_pc_enhance.html

如果你运行mvn openjpa:增强你的简单域现在看起来如下所示:(我用jad反编译类,因为它长到显示里面的所有东西,我复制了最相关的部分)

import org.apache.openjpa.enhance.*;
import org.apache.openjpa.util.IntId;
import org.apache.openjpa.util.InternalException;

public class Entity implements PersistenceCapable
{  
    public Integer getId()
    {  
        return pcGetid(this);
    }
    public void setId(Integer id)
    {
        pcSetid(this, id);
    }
    ....
    .... 
    private static final void pcSetid(Entity entity, Integer integer)
    {  
        if(entity.pcStateManager == null)
        {  
            entity.id = integer;
            return;
        } else
        {  
            entity.pcStateManager.settingObjectField(entity, pcInheritedFieldCount + 3, entity.id, integer, 0);
            return;
        }
    }
    ....
    protected void pcClearFields()
    {  
        id = null;
    }

    public PersistenceCapable pcNewInstance(StateManager statemanager, Object obj, boolean flag)
    {  
        Entity entity = new Entity();
        if(flag)
            entity.pcClearFields();
        entity.pcStateManager = statemanager;
        entity.pcCopyKeyFieldsFromObjectId(obj);
        return entity;
    }
} 

通过操作您的实体,pcStateManager会被调用。如果您运行持久化操作,持久化框架会检查状态管理器实体中是否有更改,并在必要时将更新发送到数据库。

 类似资料:
  • 所以如果我在XAML中创建一个按钮, 我可以通过以下几种方法来设置内容 等等。 我的问题是,当用户以这种方式传递内容时 wpf如何知道分配内容依赖项属性?这是我想在控件中构建的非常简洁的功能。

  • 我在laravel 5中工作,我有一个模块,用户可以在其中更新学生的信息,因为用户有一个带有当前数据的预加载表单,并且可以修改他想要的字段。然后,在控制器中,我执行以下操作: 那工作得很好。所以我的问题是:有一种方法可以获得已经更新的字段的名称?

  • 我正在使用Spring Data MongoDB和Spring Data Rest创建一个Rest API,它允许对我的MongoDB数据库进行GET、POST、PUT和DELETE操作,除了更新操作(PUT)之外,其他操作都很好。只有当我在请求体中发送完整的对象时,它才起作用,否则变量没有在rquest中发送它,则为NULL。有人能指导我解决这个问题吗。

  • 问题内容: 我有一个 可编辑的 JComboBox,无论何时通过键入或选择更改文本,我都想在其中进行一些操作。在这种情况下,文本是一个模式,我想验证该模式是否有效,并显示导致某些测试数据匹配的内容。 完成显而易见的操作后,附加一个ActionHandler,我发现,对于键入而言,该事件充其量似乎是不可靠的(选择很好)。而当它 做 火打字的结果,文字检索(使用getEditor()。getItem(

  • 我想知道记录是否更新了熊猫数据框中的日期。数据框由几列组成,其中对于A的每个值,我们有几个B的值,包括开始日期和结束日期。由于时间戳,我们可以知道是否有新的记录或以前的记录已被修改。 我想知道的是如何能够检查如果一个新记录有一个日期范围接近其他记录在其组中例如B1组如果他们有一个类似的日期范围删除前一个只留下新记录已更新,但如果它没有公共范围来解释为新记录。 例如 输入数据帧: 预期输出: 谢谢你