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 쿼리를 트리거합니다. 내가 여기서 뭔가를 놓치고 경우
은 누군가가 나이 문제를 해결 또는 정정 해줘 도와 주 시겠어요?
우리는 이미 사용할 수있는 데이터를 제어 할 수 없습니다 - 당신은 당신이 _field access_ 무슨 뜻인지 설명해 주시겠습니까? – aRvi
@aRvi getter/setter에 주석을 추가하는 대신 필드 자체에 주석을 넣습니다. –
getter에서 필드로 액세스를 이동하기 위해 아래와 같이 변경되었습니다. - 작동했습니다. Great - Jimmy T에게 감사합니다. \t'@Column (name = "CUSTOMER_ID", nullable = false)' \t'@Access (AccessType.FIELD)' \t \t'private String customerId;' – aRvi