(N) Hibernate - 여러 테이블을 하나의 클래스에 동적으로 매핑하는 것이 가능합니까?

StackOverflow https://stackoverflow.com/questions/51654

문제

나는 GIS 객체에 대한 정보를 GIS 객체의 각 유형/클래스(도로, 강, 건물, 바다 등)에 대한 별도의 데이터베이스 테이블에 저장하고 메타데이터 테이블을 저장하는 GIS 소프트웨어를 사용하는 상황에 처해 있습니다. 클래스 이름과 해당 DB 테이블에 대한 정보입니다.

서로 다른 클래스의 GIS 객체는 일부 매개변수를 공유합니다.설명 및 ID.저는 이러한 다양한 GIS 클래스를 하나의 공통 C# 클래스(GisObject라고 부르겠습니다)로 표현하고 싶습니다. 이는 주어진 GIS의 GIS 객체를 나열하는 애플리케이션의 비GIS 부분에서 수행해야 하는 작업에 충분합니다. 수업.

나에게 문제는 수신할 C# GisObject를 생성할 때 NHibernate를 사용하여 NHibernate에 설명하기 위해 해당 객체를 매핑하는 방법입니다. 테이블 이름을 매개변수로 사용 이는 메타 테이블에서 읽혀질 것입니다(두 단계로 이루어질 수 있습니다. 첫 번째 단계에서 수동으로 테이블 이름을 가져온 다음 GisObject 데이터를 가져올 때 NHibernate로 전달할 수 있습니다).

이런 종류의 상황을 처리한 사람이 있습니까? 전혀 처리할 수 있습니까?

도움이 되었습니까?

해결책 2

@브라이언 치아슨

불행하게도 클래스는 애플리케이션에서 동적으로 생성되기 때문에 GIS 데이터의 모든 클래스를 생성하는 옵션은 아닙니다.동일한 유형의 모든 GIS 데이터는 클래스여야 하지만 사용자는 새로운 데이터 세트를 가져와서 데이터베이스에 넣을 수 있습니다.내 사용자가 애플리케이션에서 어떤 클래스를 갖게 될지 미리 알 수 없습니다.따라서 내일 또 다른 새 데이터베이스 테이블이 있고 새 매핑을 사용하여 새 클래스를 생성해야 하기 때문에 전면 클래스별 매핑 모델은 작동하지 않습니다.

@all 내 gisobject 클래스의 XML 구성 파일에 내 자신의 사용자 정의 쿼리를 작성한 다음 데이터 액세스 클래스에서 해당 쿼리를 사용하여

string qs = getSession().getNamedQuery(queryName);

문자열 바꾸기를 사용하여 매개변수로 전달할 데이터베이스 이름을 삽입합니다(일부 자리 표시자 문자열을 대체하여).

qs = qs.replace(":tablename:", tableName);

그 해결책에 대해 어떻게 생각하시나요?테이블 이름을 사용자 입력으로 가져오는 통제되지 않은 환경에서는 보안 위험이 있을 수 있다는 것을 알고 있지만, 이 경우 이전에 읽을 GIS 데이터 클래스에 대한 올바르고 유효한 테이블 이름이 포함된 메타 테이블이 있습니다. GIS 객체의 특정 클래스에 대한 데이터를 가져오기 위한 쿼리를 호출합니다.

다른 팁

여기에서 수행할 수 있는 가장 간단한 일은 모든 공통 GIS 멤버로 추상 기본 클래스를 생성한 다음 필요한 NHibernate 매핑만 포함하는 다른 X 클래스를 상속하는 것일 수 있습니다.그런 다음 팩토리 패턴을 사용하여 메타데이터를 사용하여 특정 유형의 객체를 생성합니다.

이를 수행할 수 있는 한 가지 방법은 인터페이스에 선언된 공통 속성이 있는 IGisObject라는 인터페이스를 선언하는 것입니다.그런 다음 각 테이블에 매핑되는 구체적인 클래스를 구현합니다.그렇게 하면 여전히 모두 IGisObject 유형이 됩니다.

여기에서 Ayende가 말하는 내용을 볼 수 있습니다. 다중 테이블 엔터티.

하지만 별도의 테이블이 있으므로 작동하지 않을 것 같습니다.당신은 또한 확인할 수 있습니다 nhuser 그룹

나는 왜 당신이 데이터베이스에서 직접 GIS 데이터를 추적하고 일반적으로 추상화로 제공되는 API를 사용하지 않는지에 대한 질문을 던질 것입니다.ESRI 시스템인 경우 GIS 개체에 대한 정적 데이터베이스 보기를 생성할 수 있는 도구가 있으며 그 시점부터 데이터 추출에 적합할 수 있습니다.

NHibernate 문서에서 다음 중 하나를 사용할 수 있습니다. 상속 매핑.

각 테이블마다 별도의 클래스가 있을 수도 있지만 모두 공통 인터페이스를 구현하도록 할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top