2014-07-22 9 views
0

후행 공백을 제거하고, 트리밍 트림 사용시 엔티티는 dirty로 표시했다.은 JPA 하이버 네이트 : 게터/세터에 사용되는()가 최대 절전 데이터베이스 값의 후행 공백이 불량으로 엔티티 마크 관찰 지났

우리의 응용 프로그램은 스프링 데이터 JPA (1.6.1.RELEASE) 및 최대 절전 모드 (4.3.0.Final)를 사용하고 있습니다.

//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; 
} 

는 좀 debuggind을했고, 플러시 과정에서 개체에이 변경 사항 org.hibernate.event.interna.DefaultFlushEntityEventListener.dirtyCheck(final FlushEntityEvent event) 방법을 사용하는 경우 검사를 최대 절전 모드 실현 - 그것은 현재의 사람 (값)를 초기 값 (loadedState)를 비교하는 논리를 가지고있다. 이것은 -
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); 
      } 
.. 
.. 

} 

그래서 여기 문제 loadedState같은 값이 게터 방법을 사용하여 제조된다 (후행 공백, 세터 방법은 사용되지 않는다)는 같은 결과 집합으로부터 판독 된 값을 가지고 있다는 엔티티가 더티 (dirty)로 표시되고 원치 않는 UPDATE 쿼리를 트리거합니다. 내가 여기서 뭔가를 놓치고 경우

은 누군가가 나이 문제를 해결 또는 정정 해줘 도와 주 시겠어요?

답변

1

그것은 간단하다 : 기업은 (Hibernate의 관점에서) 변경과 데이터베이스에 업데이트됩니다.

당신이 중 하나를 사용하여 필드 액세스하여이를 피하거나 데이터베이스에 후행 공백을 가진 수 없습니다.

+0

우리는 이미 사용할 수있는 데이터를 제어 할 수 없습니다 - 당신은 당신이 _field access_ 무슨 뜻인지 설명해 주시겠습니까? – aRvi

+0

@aRvi getter/setter에 주석을 추가하는 대신 필드 자체에 주석을 넣습니다. –

+0

getter에서 필드로 액세스를 이동하기 위해 아래와 같이 변경되었습니다. - 작동했습니다. Great - Jimmy T에게 감사합니다. \t'@Column (name = "CUSTOMER_ID", nullable = false)' \t'@Access (AccessType.FIELD)' \t \t'private String customerId;' – aRvi