2011-10-25 4 views
1

나는 간단한 클라이언트 (JavaSE, 스윙) - 서버 (Java EE, EJB, JPA) 아키텍처를 가지고 있습니다.JPA 클라이언트 - 서버 복제/동기화 프레임 워크?

내 서버 측 엔티티에 대한 클라이언트 측 "캐시"를 만들고 싶습니다. 예를 들어, 엔티티를 다운로드하면 Embedded Derby DB (클라이언트 측 JPA 포함)에 저장하므로 다음 번에 필요할 때 클라이언트가 자체 DB에서 먼저 조회하고 거기에서 엔티티를 검색 할 수 있습니다 네트워크 통신을 절약 할 수 있습니다. (단순 복제)

내 문제는 엔티티의 ID로 시작됩니다. 클라이언트와 서버 측에서 동일한 ID를 사용하는 것이 실제로 좋지 않으므로 클라이언트 측 ID와 서버 측 ID에 대한 매핑을 저장해야합니다. 엔티티의 나는 많은 entites (15 ~ 20 ..)와 그 (것)들의 사이에서 협회가 있기 때문에 문제는 계속한다.

(병합 갱신) 서버 통신 향해 오른쪽 ID-S 배치 또는 클라이언트 측이 촉진으로 매핑 된 ID-S를 추적 유지 일부 재귀 어쩌면 반사 코드 엔진 갖도록 :

    을 나는 클라이언트 측 엔티티를 수정하고,이 서버 측에서
  • 의 (다양한 @OneToMany 외래 키에) 엔티티 세트에서 클라이언트 측 ID를 교체해야합니다 서버로 전송하기 전에, 서버에 병합 할 경우
  • 문제는 VICA 반대입니다

누구나 JPA 사용자를위한 이러한 프레임 워크를 알고 있습니까? 또는 어쩌면 구현 팁이 있습니까? 는 // 나는 사전에 가능하면

감사합니다, 안드라스 리터

을, 응용 프로그램 지속성 수준에서이 문제를 해결하고자하는

답변

0

... 어떤 문제가 발생하지 않을 것 같다. 클라이언트는 또한 서버와 동기화되어야하는 새로운 엔티티를 생성 할 수 있습니다. 또한 클라이언트와 서버는 모두 동일한 Entity 클래스, DAO 및 Service 레이어 구성 요소를 사용했습니다. 내가 만난 문제와 해결책을 공유 할 것입니다. 관련성이있는 경우 도움이되기를 바랍니다.

클라이언트와 서버에서 동일한 ID 필드를 사용했습니다. 당신이있을

하나의 문제는 자동으로 생성 된 키입니다. 내 서버 키는 MS SQL Server 데이터베이스에서 자동으로 생성되었습니다. 내 엔티티에 주석이 달렸습니다.

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 

처음으로 로컬 Derby 데이터베이스에 엔티티를 동기화 할 때 서버와 동일한 ID를 사용하는 방법이 필요했습니다.

이 작업을 수행하기 위해, 나는 키의 직접 입력을 허용하는 클라이언트 응용 프로그램에 orm.xml 파일을 만들었습니다. orm.xml은 주석을 대체합니다.

은 참조 : Sequence Generator in persistence.xml 위의 링크에서 물론

, 내가 로컬 데이터베이스에 대한 사용자 정의 생성기를 지정했습니다. ID 필드는 자동 생성이없는 것으로 지정합니다.

새로운 엔터티를 만들기 때문에 클라이언트에서 생성기가 필요했습니다. 이 경우에는 새로운 키를 생성하고 서버에서 엔티티를 삽입하는 방법이 필요했습니다. 나는 JPA 제공자로서 Hibernate를 사용했다. 이것은 엔티티가 새로운 것인지 아니면 이미 ID가 있는지를 파악한 리스너를 생성 할 수있게 해줍니다. 이를 기반으로 생성자가 ID를 만들도록 허용했거나 이미 해당 엔터티에있는 ID를 사용했습니다.

은 참조 : JPA ID Generation Strategy

다음 내가 서버 개체가 새로운 무엇인지 알 수있는 방법이 필요했습니다. 위의 링크에서 내 발전기가 100000000에서 시작되었음을 볼 수 있습니다. 의 경우이 숫자는 서버가 오랫동안 높은 ID를 갖지 않을만큼 충분히 높습니다. 물론 그것은 가장 깨끗한 해결책이 아니며 클라이언트의 모든 ID에 대해 음수를 사용하려고 시도했지만 Hibernate는 버그로 인해 시퀀스를 제대로 만들지 않습니다.

참조 : JPA/Hibernate/Derby TableGenerator use negative values

그래서 나는 그들 중 하나가 매직 넘버 (100,000,000) 위의 경우 모든 개체가 올라오고 확인 서버에, 내가 저장하기 전에 자신의 ID를 널 (null). 이렇게하면 서버가 새로운 것으로 추가하고 서버에서 ID를 가져옵니다. 그런 다음 클라이언트와 다시 동기화해야합니다.

희망이 도움이되었습니다.

+0

팁 주셔서 감사합니다! 나는 많은 프레임 워크가 있는지 궁금해하며, 많은 중첩 된 엔티티에 대해 ID 처리 로직을 구현하는 것을 건너 뛸 수있다. –

+0

최대 절전 모드 청취자는 모든 엔티티에서 작동했습니다. 엔티티가 데이터베이스에 저장되면 실행됩니다. 유일한 ID 논리는 클라이언트에서 서버로 동기화되었습니다. 당신은 아마 그것도 청취자를 쓸 수 있습니다. 그러면 모든 것이 2 개의 클래스에 포함됩니다. – Allan

1

무엇 동일한 ID를 사용하지? 당신은 다른 사람이 시도하지 않은 경우 당신은 내가 최근에 로컬 더비 DB에 저장, 서버와 개체를 동기화하는 클라이언트 코드

+0

동일한 ID를 사용하는 것에 대한 기본적인 문제는 오프라인 사용 가능성입니다. 클라이언트 측에 새 엔티티가있을 때 (예 : 아무 서버 연결, 나는 여전히 클라이언트 측에서 엔티티를 먼저 저장해야하므로 ID가 클라이언트 DB에서오고 동기화 중에 ID-s를 다시 처리해야합니다. –

관련 문제