2008-09-09 8 views
2

GIS 객체에 대한 정보를 각 유형/GIS 객체 클래스에 대한 별도의 데이터베이스 테이블에 저장하는 GIS 소프트웨어를 사용하는 상황이 있습니다. , river, building, sea, ...) 클래스 이름과 DB 테이블에 대한 정보를 저장하는 메타 데이터 테이블을 유지합니다.(N) Hibernate - 하나의 클래스에 여러 테이블을 동적으로 매핑 할 수 있습니까?

서로 다른 클래스의 GIS 개체는 설명과 ID라는 몇 가지 매개 변수를 공유합니다. 나는이 GIS 클래스를 하나의 공통 C# 클래스 (GisObject라고 부르 자)로 표현하고자한다. 주어진 GIS의 GIS 객체를 나열하는 애플리케이션의 GIS가 아닌 부분에서해야 할 일을하기에 충분하다. 수업.

에게 는

나를 위해 문제가받을 C#을 GisObject를 만들고 이 메타 테이블에서 읽을 수 있습니다 매개 변수로 테이블 이름을 사용할 때 NHibernate에에게 설명 자 NHibernate를 사용하는 객체를 매핑하는 방법입니다 (이 될 수 있습니다 두 단계에서 나는 수동으로 첫 번째 단계에서 테이블 이름을 가져온 다음 GisObject 데이터를 가져올 때 NHibernate로 전달할 수 있습니다.

아무도 이런 상황을 처리하지 못했고 전혀 완료 할 수 있습니까?

답변

1

@ 브라이언 Chiasson는

불행하게도,이 클래스는 응용 프로그램에서 동적으로 생성되기 때문에 GIS 데이터의 모든 클래스를 생성 할 수있는 옵션이 아니다. 동일한 유형의 모든 GIS 데이터는 클래스 여야하지만 내 사용자는 새로운 데이터 세트를 가져 와서 데이터베이스에 저장할 수 있습니다. 내 사용자가 애플리케이션에서 어떤 클래스를 사용하는지 미리 알 수 없습니다. 따라서 내일 새로운 데이터베이스 테이블이 생기고 새로운 매핑을 사용하여 새 클래스를 만들 필요가 있기 때문에 in-front per-class 매핑 모델이 작동하지 않습니다.

는 @All 거기

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

를 사용하여 해당 쿼리를 가져 오는 데이터 액세스 클래스에 다음, 내 GisObject 클래스의 XML 설정 파일에 내 자신의 사용자 지정 쿼리를 작성하는 가능성을하고 문자열을 사용할 수 있습니다 어떤 매개 변수로 전달할 데이터베이스 이름을 삽입 (일부 자리 표시 자 문자열 대체)하여 대체하십시오.

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

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

0

당신이 할 수있는 한 가지 방법은 인터페이스에 선언 된 공통 속성을 가진 IGisObject라고 말하는 인터페이스를 선언하는 것입니다. 그런 다음 각 테이블에 매핑되는 구체적인 클래스를 구현하십시오. 그런 식으로 그들은 여전히 ​​모든 유형의 IGisObject가됩니다.

+0

테이블은 사용자가 동적으로 생성합니다. 사용자가 새로운 클래스의 데이터를 얻었을 때 (즉, 일부 소스에서 철도 컬렉션을 얻음) 애플리케이션에 입력하려고 할 때 새로운 테이블이 생성되고 새로운 테이블에 대한 별도의 매핑없이 새로운 데이터에 액세스 할 수있는 방법이 필요합니다. 새 테이블. – zappan

0

여기에 Ayende가 말한 것을 볼 수 있습니다 : MultiTable Entities.

하지만 별도의 테이블이 있으므로 작동하지 않을 것이라고 생각합니다. 체크 아웃 할 수도 있습니다 nhuser group

1

여기서는 가장 간단한 방법으로 모든 일반 GIS 멤버로 추상 기본 클래스를 만든 다음 다른 모든 X 클래스를 상속받을 수 있다고 생각합니다. 필요한 NHibernate 매핑. 그런 다음 Factory 패턴을 사용하여 메타 데이터를 사용하여 특정 유형의 객체를 만듭니다.

0

나는 왜 당신이 데이터베이스에서 직접 GIS 데이터를 따르고 일반적으로 당신을위한 추상화로 제공되는 API를 사용하지 않을지에 대한 질문을 던지겠다. 이것이 ESRI 시스템이라면 GIS 오브젝트에 정적 데이터베이스 뷰를 생성 할 수있는 도구가 있으며, 그 시점부터 데이터 추출에 적합 할 수도 있습니다.

+0

intergraph의 api를 사용합니다. 이유는 api가 잘 설계되고 구축되지 않았기 때문입니다. 그래서 난 드롭 다운 목록, 체크리스트 및 그런 것들에 대한 응용 프로그램에서 사용되는 C# 클래스로 아닌 - gis 속성을 추출 해요. 맵 렌더링의 경우, 인터 그래프의 API가 사용됩니다. – zappan

0

NHibernate 설명서에서 inheritance mappings 중 하나를 사용할 수 있습니다.

각 테이블마다 별도의 클래스가있을 수도 있지만 모두 공용 인터페이스를 구현해야합니다.