我现在有点困惑。我将尽力解释我的担忧:
我有一个Spring Boot应用程序,它当然有实体。这些实体通过百里香形式更新。在这种形式下,只有一些相关的字段可以更改。例如,实体的name
。其他字段,例如created
,createdby
或lastUsedBy
不受此表单的控制/更改。
现在解决问题:如果现在更改实体,则所有其他字段均设置为null
,因为它们不在请求中。一种方法是为这些缺少的字段添加<input type="hidden"/>
输入。但这不是很优雅并且容易出错。
比起我得出的结论,休眠仅应更新已更改的字段。因此,这必须通过DirtyTracking完成。我当前有另一个应用程序,该应用程序将OpenJPA与openJPA Enhancer结合使用,并且在此应用程序中,更新仅更新更改的字段。我的假设是Hibernate增强器可以解决我的问题。但是即使启用了脏跟踪,也会更新所有字段,并且信息会丢失。
当我将@DynamicUpdate
注释添加到给定实体时,我设法使其正常工作,但这不是正确的方法吗?
我仔细检查了实体是否得到了增强,还调试了spring / hibernate的整个保存过程。我在这里想念什么吗?为何休眠也会更新所有非脏字段?
编辑
我已经进行了进一步检查,到了这一点:代码来自AbstractEntityTuplizer
public void setPropertyValues(Object entity, Object[] values) throws HibernateException {
boolean setAll = !entityMetamodel.hasLazyProperties();
for ( int j = 0; j < entityMetamodel.getPropertySpan(); j++ ) {
if ( setAll || values[j] != LazyPropertyInitializer.UNFETCHED_PROPERTY ) {
setters[j].set( entity, values[j], getFactory() );
}
}
}
values对象数组仅预填充了几个值,只有已更改/脏的值。例如
values[5]
和values[6]
。但是,将调用所有的setter并将值设置为null
(如果它们尚未出现在该函数的值参数中)。 最佳答案
使用@DynamicUpdate是一种方法,当使用@DynamicUpdate注释实体时,在更新阶段,hibernate不会对未更改的列发出更新语句。保存实体时,创建,创建者和lastUsedBy不会更改。
看到:
@DynamicUpdate
@DynamicInsert