2008-10-08 3 views
2

나는 Hibernate로 검색된 데이터베이스에서 객체를 직렬화하려고하는데, 객체의 실제 데이터 전체 (사이클 포함)에만 관심이있다.Hibernate 컬렉션을 올바르게 직렬화하는 방법은 무엇입니까?

지금은 XStream으로 작업하고 있습니다. XStream의 문제점은 정보가 너무 맹목적으로 보입니다. 그것은 Hibernate의 PersistentCollections를 그대로, 모든 Hibernate 메타 데이터를 포함하여 인식한다. 나는 그들을 연재하고 싶지 않다.

그래서 PersistentCollection 내에서 원래 Collection을 추출하고 객체가 가리킬 수있는 모든 참조 데이터를 초기화하는 합리적인 방법이 있습니까? 아니면 더 나은 접근 방법을 추천 해 주시겠습니까?

(Simple의 결과가 완벽하게 보이지만,이 달력과 같은 기본 폴더의 유틸리티 클래스에 대처할 수 없습니다 또한 한 번에 하나의 주석 개체를 받아들입니다.)

답변

1

솔루션은 나를 위해 잘 작동 : http://jira.codehaus.org/browse/XSTR-226

아이디어를 최대 절전 모드 및 표준 컨버터를 해당 호출에서 실제 수집을 추출합니다 사용자 정의 XStream을 변환/최대 절전 모드 모음에 대한 매퍼를하는 것입니다 (ArrayList를위한 , HashMap 등)

1

내가 간단한 방법 추천 : 사용자 도저 : http://dozer.sf.net. Dozer는 Bean Mapper이며이를 사용하여 PersonEJB를 같은 클래스의 객체로 변환 할 수 있습니다. Dozer는 getter() 호출을 통해 모든 프록시 fecthes를 재귀 적으로 트리거하고 src 유형을 dest 유형으로 변환합니다 (java.utilDate에 java.sql.date라고 가정 해 봅시다).

가 여기에 조각입니다 :

MapperIF mapper = DozerBeanMapperSingletonWrapper.getInstance(); 
PersonEJB serializablePerson = mapper.map(myPersonInstance, PersonEJB.class); 

곰 염두에두고, 도저는 개체 트리를 통해 산책으로 개체 그래프가 많은 프록시가있는 경우가 많은 쿼리를 볼 수 있도록 프록시로드를 하나씩, 트리거, 비쌀 수 있습니다.

+0

XML 구성 파일이 필요합니까? –

0

대체로 가장 좋은 방법은 무엇일까? 현재 내가하고있는 방식은 DTO 개체의 또 다른 레이어를 만드는 것입니다. 이렇게하면 그래프를 직렬화하는 깊이를 제한 할뿐만 아니라 채널을 이동하지 않으려는 데이터를 제외 할 수 있습니다. Hibernate 객체에서 Flex 클라이언트로 현재 DTO (Data Transfer Object)를 위해 Dozer를 사용합니다.

그것은 몇 가지주의와 함께, 좋은 작품 :

  • 그것은 명백히 느린 사실, 빠른 아니다. 많은 양의 데이터를 보내면 Dozer는 제대로 작동하지 않습니다. 이것은 주로 마법을 수행하는 리플렉션 때문입니다.
  • 경우에 따라 특수 동작을 위해 사용자 지정 변환기를 작성해야합니다. 이것들은 잘 작동하지만 쌍방향입니다. 개인적으로 단방향 사용자 지정 변환기를 허용하기 위해 Dozer 소스를 해킹해야했습니다. 여기에 설명