JPA Hibernate:使用trim删除尾部空格时标记为脏的实体
据观察,当数据库值中有尾随空格时,Hibernate会将实体标记为dirty,并且在getter/setter中使用trim() 我们的应用程序使用SpringDataJPA(1.6.1.RELEASE)和Hibernate(4.3.0.Final) 我做了一些调试,并意识到在刷新过程中,Hibernate使用JPA Hibernate:使用trim删除尾部空格时标记为脏的实体,hibernate,jpa,entity,flush,spaces,Hibernate,Jpa,Entity,Flush,Spaces,据观察,当数据库值中有尾随空格时,Hibernate会将实体标记为dirty,并且在getter/setter中使用trim() 我们的应用程序使用SpringDataJPA(1.6.1.RELEASE)和Hibernate(4.3.0.Final) 我做了一些调试,并意识到在刷新过程中,Hibernate使用org.Hibernate.event.interna.DefaultFlushEntityEventListener.dirtyCheck(最终FlushEntityEvent事件)方法
org.Hibernate.event.interna.DefaultFlushEntityEventListener.dirtyCheck(最终FlushEntityEvent事件)
方法检查实体是否有任何更改-它具有将初始值(loadedState)与当前值(Value)进行比较的逻辑
因此,这里的问题是loadedState按原样从resultSet读取值(使用尾随空格,不使用setter方法),其中as值是使用getter方法准备的-这会导致实体被标记为脏,并触发不需要的更新查询
有人能帮我解决这个问题吗?如果我在这里遗漏了什么,请纠正我吗?很简单:实体已经更改(从Hibernate的角度来看),并且在数据库中得到更新
您可以通过使用字段访问或在数据库中不使用尾随空格来避免这种情况。我们无法控制已经可用的数据-请您解释一下字段访问的含义好吗?@aRvi没有将注释放在getter/setter上,而是将注释放在字段本身上。我更改如下,将访问从getter to field-它很有效,非常好-感谢Jimmy T.
@Column(name=“CUSTOMER\u ID”,nullable=false)
@Access(AccessType.field)
//getter method -- CUSTOMER_ID column values have trailing spaces in DB
@Column(name = "CUSTOMER_ID", nullable = false)
public String getCustomerId() {
return this.customerId == null ? null : this.customerId.trim();
}
//setter method
public void setCustomerId(String customerId) {
if(customerId!=null){
customerId = customerId.trim();
}
this.customerId = customerId;
}
protected void dirtyCheck(final FlushEntityEvent event) throws HibernateException {
final Object[] values = event.getPropertyValues();
..
final Object[] loadedState = entry.getLoadedState();
..
..
if ( !cannotDirtyCheck ) {
// dirty check against the usual snapshot of the entity
dirtyProperties = persister.findDirty( values, loadedState, entity, session );
}
..
..
}