2011-10-28 3 views
0

주소와 같은 엔티티가 있습니다. 성능 문제로 인해 전체 필드를 "street; zip; city"와 같은 단일 필드에 저장하려고합니다.SQL 인젝션을 피하면서, Hibernate에서 String 유사 정보를 저장하기위한 EnhancedUserType을 작성하십시오.

이렇게하려면 EnhancedUserType을 만들 수 있습니다. 내가 찾은 몇 가지 예에서와 방법 "objectToSQLString을"최대 절전 모드의 소스는 항상 그런 식으로 구현됩니다 방법은 SQL 표현을 반환 아닌지 내가 이해하지 못하는

@Override 
public String objectToSQLString(Object object) { 
    if (object != null) { 
     Address oo = (Address)object; 
     return "'" + oo.toSomeString() + "'"; 
    } else { 
     return ""; 
    }  
} 

. [ ']와 같은 특수 기호가 문자열 안에 이스케이프되지 않는 이유는 무엇입니까? 어떻게 그들을 벗어나야합니까? 표준 SQL 방법은 [ '] -> [' ']이지만, 일부 방언 [백 슬래시]도 이스케이프해야합니다.

dialect에 의존하여 나를 위해 이스케이프 처리를 수행 할 수있는 Hibernate 유틸리티가 있습니까? Hibernate는 어떻게이 문제를 해결할 수 있습니까? 소스 코드에서 찾을 수 없습니다 :-(

+0

[구성 요소 매핑] (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html)? – millimoose

+0

JDBC 준비 문을 사용할 수없는 이유는 무엇입니까? – ChadNC

+0

필자는 Prepared Statement를 항상 사용하지만, Hibernate는이 메소드가 포함 된 EnhancedUserType을 구현하기를 원한다. – 30thh

답변

1

작은 따옴표로 둘러싸여 있고 내부 범위가 이스케이프 된 SQL 리터럴 문자열을 실제로 반환해야합니다. AFAIK, 작은 따옴표 만 이스케이프해야합니다 (이중 인용 부호 : 'O''Reilly'). . 적어도 아파치 commons-lang StringEscapeUtils가 수행하는 것 (또는 수행)

그러나 나는 이처럼 전체 주소를 하나의 열에 넣음으로써 어떤 이득도 얻지 못할 것이라고 생각합니다. 주소의 필드를 확인하십시오.이 세 필드가 성능 문제를 일으킨 것으로 측정 했습니까?이 열을 한 열에 넣으면 문제가 해결 될 것입니까?

+0

우리는 이러한 작은 종속 객체를 많이 가지고 있으며 (SOAP를 통해 전송하기 때문에) 모든 객체를 열심히로드해야합니다. – 30thh

+0

그렇다고해서 동일한 테이블에 있더라도 데이터베이스에있는 여러 열에 이러한 포함 된 개체를 저장하는 것을 방해하지는 않습니다. http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-component –

+0

작은 따옴표는 문제가되지 않습니다.를 참조하십시오. 이 문제는 이스케이프에도 사용할 수있는 MySQL 표기법의 백 슬래시입니다. 나는 Hibernate가 어떻게 처리하는지 궁금하다. – 30thh

관련 문제