2008-10-31 5 views
12

Firebird 데이터베이스를 데이터 저장소 (포함 모드)로 사용하고 ORM에 NHibernate를 사용하는 데스크톱 (winforms) 응용 프로그램이 있습니다. 우리가 지원해야하는 기능 중 하나는 데이터 그룹을 외부 파일로 가져오고 내보낼 수있게하는 것입니다. 현재이 외부 파일은 기본 데이터베이스와 동일한 스키마를 가진 데이터베이스이기도합니다.NHibernate를 사용하여 여러 데이터베이스 간의 개체 복사

나는 이미 여러 개의 데이터베이스를보기 위해 NHibernate를 설정하고 두 데이터베이스를 동시에 사용할 수있다. 그러나 문제는 두 데이터베이스간에 데이터를 복사하는 것입니다. 저는 두 가지 복사 전략을 가지고 있습니다 : (1) 객체에 대한 동일한 ID (일명 가져 오기/내보내기)와 (2) 대부분 새로운 ID [일명 중복/복사본]로 복사합니다. 같은 ID로 항상 복사되는 조회 항목이 있기 때문에 "거의 새로운"이라고 말합니다.

모든 사본을 만들고 새 ID를 할당하지 않거나 (개체 트리의 모든 ID를 지울 수있는) "CopyForExport"메서드가 있기 때문에 새로운 ID로 모든 것을 복사하면됩니다.

이 상황을 처리하고 동일한 ID를 유지하면서 데이터베이스간에 데이터를 복사하는 "모범 사례"방법은 무엇입니까?

설명 : 하위 집합 (사용자 선택 가능) 또는 다른 사람에게 전송할 데이터 (자신의 데이터베이스로 데이터의 하위 집합을 가져 오는)를 내보내는 두 개의 데이터베이스를 동기화하려고하지 않습니다.

추가 설명 : 나는이 문제를 다음과 같이 분리했다 : NHibernate의 ISession.SaveOrUpdate 기능을 사용하려고하는데 "할당되지 않은"ID 생성기로 엔티티를 설정했다. 그러나, 동일한 프로세스에서 여러 데이터베이스간에 데이터를 복사하기 위해 생성 된 ID를 재정의하려는 경우 문제점이 있습니다.

Guid.Comb 또는 UUID 생성기를 사용할 수 있지만 때때로 (동일한 스키마로 다른 데이터베이스 연결로 전송할 때) 내 고유 식별자를 지정할 수있는 방법이 있습니까?

답변

13

내 질문에 대한 답변을 찾았습니다. 키는 ISession.Replicate 메서드입니다. 이를 통해 데이터 저장소간에 개체 그래프를 복사하고 동일한 식별자를 유지할 수 있습니다. 새 식별자를 만들려면 ISession.Merge를 사용할 수 있다고 생각하지만 여전히 확인해야합니다.

하지만 몇 가지주의해야 할 점이 있습니다. 테스트 클래스에 상위 개체 (다 대일 관계)에 대한 참조가 있고 복제를 제대로 수행하기 위해 클래스를 비 게으름로드로 설정해야했습니다. 열망한로드 (게으른로드가 아닐 것 같습니다)로 설정하지 않은 경우 객체 만 복제하고 hbm.xml 파일에서는 부모 객체 (cascade = "all")는 복제하지 않습니다.

자바 하이버 네이트 문서는 Replicate()에 대한 참조를 가지고 있지만, NHibernate 문서는 (java 문서에서 section 10.9)이 아니다.

완전히 수화 된 엔터티를 다른 데이터 저장소로 전송하기 전에 해당 엔터티를 갖고 싶어하기 때문에 Replicate 동작을 이해하는 것이 좋습니다. 이상하게도 두 세션이 열려 있더라도 (각 데이터 저장소에 하나씩), 복제 할 때 객체를 수화하는 것을 생각하지 않았습니다.

+0

마지막으로이 솔루션을 찾았는데 비슷한 문제가있었습니다. 나는 그것이 최대 절전 모드 사이트가 현재 다운 된 것을 돕지 않았다고 가정한다. – LizB

0

이 경우 FBCopy을 사용할 수 있습니다. 복사 할 테이블과 열을 정의하면됩니다. 각 테이블에 선택적 WHERE 절을 추가하여 원하는 행만 복사 할 수도 있습니다.

복사하는 동안 데이터 내보내기 순서가 유지되므로 외래 키가 손상되지 않습니다. 또한 발전기를 지원합니다.