2013-04-26 5 views
0

문자열 (또는 객체)의 arraylist를 최대 절전 모드로 저장하는 방법에 대한 질문이 있습니다. I read here, 그래서 그들은 Hibernate가 그것을 유지하기 위해 arraylist의 toString 메소드를 호출 할 것이라고 말했다.ArrayList를 유지할 때 toString 메서드를 호출 하시겠습니까?

나는 테스트를 위해 작은 코드를 썼지 만 그들이 말한 것과 같이 작동하지 않습니다.

class CustomizeArrayList extends ArrayList<String> 
    private static final long serialVersionUID = 1L; 

    @Override 
    public String toString() { 
     // TODO Auto-generated method stub 
     System.out.println("To String of customize arraylist"); 
     return super.toString(); 
    } 
} 

나는 그래서이 유형을 사용하고 있습니다 :

@Column("array") 
private CustomizrArrayList array 

그것은 toString 메소드를 호출 아니에요, 그것은 지속되거나 오히려 직렬화 또는 다른 어떤 리플렉션을 사용?

미리 감사드립니다.

+3

"나는 선가"는 좋은 출발점이 결코 없다. 정확한 기사를 참조하십시오. –

+0

http://stackoverflow.com/a/16033833/1492882. 다음은 참조 링크입니다. –

+3

그 질문에, 그들은 ** 목록 **이 아니라 ** 배열 **에 대해 이야기합니다. Hibernate는리스트를 다루는 방법을 알고있다. –

답변

0

Hibernate는 많은 내부 Java 유형과 변환 방법을 알고있다. List 유형이 그 중 하나입니다. Hibernate는 모든리스트 유형 (링크 된, 배열 기반 또는 사용자 정의 된)에 대해 기본적으로리스트의 모든 요소를 ​​다른 테이블에 넣으려고하는 동일한리스트 기반 접근법을 사용할 것이다.

당신은 원하지 않습니다. 원하는 것을 얻기위한 한 가지 방법은 사용자 정의 유형 대신 String[] (즉, 모음 대신 기본 배열 유형)을 사용하는 것이지만 다른 곳에서는 새로운 문제를 일으킬 수 있습니다.

올바른 해결책은 당신이이 타입의 특별한 처리가 필요하다는 것을 Hibernate에게 알려주는 것이다. 인터페이스 UserType (docs)을 구현하십시오. nullSafeGet()nullSafeSet() 메서드에서 DB 열 (VARCHAR, 내가 추측하는 것)과 CustomizeArrayList 사이를 변환 할 수 있습니다.

당신은 "유형의 레지스트리"를 사용할 수 있습니다 ( see here를) 유형을 등록하려면 또는 @Type 주석 ( blog post)

+0

답장을 보내 주셔서 감사합니다. 그러나'String []'또는'ArrayList'를 저장하면 Hibernate는 테이블의 내 레코드에 이상한 문자열을 추가합니다. 16 진수 문자열이고 컴퓨터의 메모리 주소와 비슷합니다. toString 메소드. –

+0

Hibernate는 대개 여러분의 클래스를 프록시로 감싸므로 기대하는'toString()'을 호출하지 않을 수도 있습니다. 또한 데이터베이스에서이 값을 읽으 려 할 때 어떻게 계획합니까? "fromString()"메소드가 없습니다 ... –

관련 문제