2008-11-11 2 views
6

NHibernate에 비교적 익숙하지만, 지난 몇 개의 프로그램에서이 프로그램을 사용하고있어. 필자는 4-5 개 데이터베이스의 데이터를 단일 데이터베이스로 집계해야하는 상황에 왔습니다. 특히 일련 번호 데이터입니다. 각 데이터베이스는 자체 매핑 파일을 갖지만 궁극적으로 엔티티는 모두 동일한 기본 구조 (직렬 클래스)를 공유합니다.NHibernate : 하나의 기본 클래스, 여러 매핑

나는 NHibernate가 클래스마다 매핑을 원한다는 것을 이해한다. 그래서 나의 초기 생각은 기본 직렬 클래스를 가지며 각각 다른 데이터베이스에 대해 상속 받고 고유 한 매핑 파일을 생성한다. 상속 된 클래스는 0 개의 내용을 가질 것이다. 이것은 모든 데이터를 포착하고 객체를 채우기에 적합합니다. 그런 다음 기본 클래스 매핑을 사용하여 기본 클래스 테이블에 상속 된 클래스 (적절한 용어가 무엇인지 확실하지 않음)를 저장합니다.

문제는 NHIbernate가 개체에 대해 특정 매핑 파일을 사용하도록하는 방법을 모르는 것입니다. 'session.save()'를 사용할 때 상속 된 클래스를 기본 클래스로 캐스팅하는 작업은 아무 것도하지 않습니다 (매핑이 없다는 오류 메시지가 표시됨).

사용할 매핑을 명시 적으로 지정하는 방법이 있습니까? 아니면 기본 클래스에 상속 된 클래스를 더 구체적으로 캐스팅하기 위해 누락 된 일부 OOP 보안 주체가 있습니까? 아니면이 아이디어는 나쁜 것입니다.

NHibernate (8 장)와 관련하여 찾을 수있는 모든 상속 내용은이 함수에 완전히 적용되지 않는 것처럼 보이지만 잘못 될 수 있습니다 (concrete-table-per-concrete 클래스는 유용 할 수 있지만, 하지만 NHibernate가 어떻게해야 할지를 결정하는 것과 관련하여 전적으로 내 머리를 감쌀 수는 없습니다.)

답변

4

이것이 도움이 될지 모르겠지만 기본적으로 그렇게하려고하지는 않습니다.

본질적으로 나는 "골더 해머 (golder hammer)"증후군을 앓고있는 것 같아요. 정말 멋진 망치 (예 : 최대 절전 모드 (그리고 당신의 의견을 공유합니다. 확대경 도구입니다.)) 손톱.

저는 일반적으로 단순히 "수동 변환"클래스를 사용하려고합니다. 즉, 개별 직렬 클래스에 대한 최대 절전 클래스를 가져 와서 데이터를 고유 한 특정 형식으로 단순히 복사하는 생성자를 가진 클래스입니다. Hibernate는 자신의 매핑을 사용하여 그것을 (단일) 데이터베이스로 단순히 직렬화 할 수있다.

사실상 이것이 더 나은 해결책이라고 생각하는 이유는 효과적으로 당신이하려고하는 것은 클래스에서 비대칭 직렬화가 있다는 것입니다. 즉 파생 클래스의 한 데이터베이스에서 읽은 후 기본 클래스의 다른 데이터베이스에 쓰십시오. 근본적으로 단방향 프로세스라는 점을 제외하고는 그다지 끔찍한 것은 없습니다. 한 데이터베이스에서 다른 데이터베이스로의 변환을 원한다면 단순히 변환을 수행하고 그 변환을 끝내십시오.

+0

Yah, 나는 동의한다. 나는 은색 총알을 원했지만 당신이 언급 한 것은 완벽하게 작동합니다. – anonymous

2

도움이 될 수 있습니다. 문서에서

Using NHibernate with Multiple Databases

;

소개

... 는 ASP.NET NHibernate에 함께 사용하여 설명; 단일 데이터베이스와 통신하는 에 대한 지침을 제공했습니다. 그러나 때로는 과 동시에 여러 데이터베이스와 통신해야합니다 ( ). NHibernate가 을 수행하려면 세션 팩토리가 과 통신 할 각 데이터베이스에 대해 존재해야합니다. 그러나 여러 데이터베이스가있는 경우가 종종 인 경우 일부 개의 데이터베이스가 거의 사용되지 않습니다. 그래서 실제로는 이 될 때까지 세션 팩토리를 만들지 않는 것이 좋습니다. 이 기사는 을 픽업합니다. ASP.NET 기사가있는 이전 NHibernate는이 간단한 구현 방식의 구현 정보 인 을 설명합니다. 이전 기사가 ASP.NET에 초점을 맞추었지만 은 ASP.NET과 .NET의 에서 아래 제안 사항을 지원합니다.

...

여러 데이터베이스와 을 작업 할 때해야 할 첫 번째 일은 구성 적절한 통신이다. 데이터베이스마다 별도의 구성 파일을 만들고 모두 구성 폴더에 넣은 다음 web/app.config에서 참조하십시오.

...

0

나는 이것이 내가 무엇을해야됩니다 100 % 확실하지 않다,하지만 난 NHibernate에 익명의 유형에 대해이 인터넷 검색을 오늘 발견

http://infozerk.com/averyblog/refactoring-using-object-constructors-in-hql-with-nhibernate/

흥미로운 부분은 (나에게있어,이 글을 처음 접했을 때) HQL select 절의 'new'키워드이다. 그래서 내가 할 수있는 것은 SerialX를 DatabaseX에서 mappingX를 사용하여 선택하고 SerialY (general/base Serial) 생성자에 전달하는 것입니다. 그래서 지금은 SerialY 매핑 X/databaseX, 그리고 (잘하면) 내가 session.save 수 NHibernate mappingY/databaseY 사용할 것입니다 생성 된 있습니다.

내가 좋아하는 이유는 단순히 동일한 데이터가 유지되는 두 개의 클래스가없는 것입니다 (제 생각!). SerialX의 목록을 반환하고 SerialY를 생성하고이를 새로운 목록에 추가합니다 (주어진 첫 번째와 가장 좋은 대답).

이것은 상속을 사용하여 NHibernate 매핑을위한 유용한 케이스를 만드는 일반적인 이점이 없지만 원하는 제한된 작업을 수행 할 것이라고 생각합니다.

0

실제로 각 테이블에 매핑 파일/클래스가 필요하지만 모든 클래스가 공통 인터페이스를 구현하지 못하도록하는 것은 아닙니다.

그런 다음 응용 프로그램 계층 해당 클래스의 각 목록을 구현 (예 : 목록))에서 하나의 콜렉션으로 모두 함께 집계 할 수

당신은 아마에있는 세션을 추적하기 위해 몇 가지 배관을 작성해야합니다 업데이트를 원한다면 데이터베이스를 저장하십시오 (여러 데이터베이스를 대상으로하고 있기 때문에). 그러나 그렇게하는 과정은 당신이 일을 어떻게 설정 했느냐에 따라 달라질 것입니다.

0

저는 코드에 모든 게시물을 작성하여 Dan에 응답합니다. 결국 나는 그 명백한 것을 놓쳤다 고 생각한다.

public class Serial 
{ 
    public string SerialNumber {get; set;} 
    public string ItemNumber {get; set;} 
    public string OrderNumber {get; set;} 
} 

...

Serial serial = sessionX.get(typeof(Serial), someID); 
sessionY.save(serial); 

NHibernate에이에 대한 GET 및 mappingY에 대한 mappingX를 사용해야하는 세션이 공유되지 않는 및 매핑이 세션에 연결되어 있기 때문에 저장합니다. 따라서 특정 세션에서 클래스 관계에 대한 단일 매핑 만 있기 때문에 같은 클래스를 가리키는 2 개의 매핑을 가질 수 있습니다.

나는 적어도 그것이 사실이라고 생각한다 (atm을 테스트 할 수 없다).

불행히도이 특별한 경우는 정말로 지루하고 유용하지 않습니다. 동일한 도메인의 다른 프로그램에서 비즈니스 로직의 특정 부분에 대한 기본 클래스에서 파생됩니다. 나는 작은 코드 조각을 만들기 쉽기 때문에 매핑 파일을 만들고 싶지 않았다. 어쨌든, 내 첫 번째 질문과 같은 이유로 인해 NHibernate에서 작동하게 만들 수 없었으며 McWafflestix가 (중요하지 않았기 때문에) 해결하기 위해 설명하는 방법을 수행했습니다.

내가 구글을 통해이 발견 한 것을

:

정확히 같은 상황이며,이 (아마도)가 나타납니다

http://jira.nhibernate.org/browse/NH-662

는 NH 2.1에서 해결? 나는 아직 그것을 따라하지 않았다.

(참고 : Dan, 제 경우에는 여러 DB에서 하나만 쓰고 있습니다. 다른 경우에는 좋은 생각이라고 생각하기 때문에 인터페이스에 대한 귀하의 제안에 여전히 관심이 있습니다. 인터페이스에 대한 매핑? 매핑 정의가없는 인터페이스를 구현하는 클래스를 저장하려고하면 NHibernate에서 인터페이스 매핑을 사용합니까? 아니면 구현하는 각 클래스에 대한 매핑에서 빈 서브 클래스를 선언해야합니다. 인터페이스 매핑?)