(N)休眠-是否可以将多个表动态映射到一个类
我遇到的情况是,我使用GIS软件将有关GIS对象的信息存储到GIS对象的每种类型/类别(道路,河流,建筑物,海洋等)的单独的数据库表中,并保留其中存储的元数据表有关类名及其数据库表的信息。
那些不同类别的GIS对象共享一些参数,即描述和ID。我想用一个通用的Cclass代表所有这些不同的GIS类(我们称其为GisObject),这足以满足我从列出给定GIS类的GIS对象的应用程序的非GIS部分中需要做的事情。
对我来说,问题是如何在创建CGisObject时使用NHibernate将这些对象映射为NHibernate来接收和使用表名作为参数,并将其从元表中读取(可以分两步,我可以手动进行首先提取表名,然后在提取GisObject数据时将其传递给NHibernate。
有没有人处理过这种情况,可以做到吗?
解决方案
回答
一种方法是声明一个接口IGisObject,该接口具有在接口上声明的公共属性。然后实现一个映射到每个表的具体类。这样,它们仍然都是IGisObject类型。
回答
我们可以在这里查看Ayende在说什么:MultiTable实体。
但是由于我们有单独的表,所以我认为它不起作用。
我们还可以签出nhuser组
回答
听起来这里要做的最简单的事情可能是创建一个具有所有常见GIS成员的抽象基类,然后继承其他X类,它们仅具有必要的NHibernate映射。然后,我将使用Factory模式使用元数据创建特定类型的对象。
回答
@布莱恩·基亚森(Brian Chiasson)
不幸的是,创建所有GIS数据类并不是一种选择,因为这些类是在应用程序中动态创建的。每个相同类型的GIS数据都应该是一个类,但是我的用户可以获取新的数据集并将其放入数据库中。我不知道用户在应用程序中将拥有哪些类。因此,前端的每类映射模型不起作用,因为明天将有另一个新的数据库表,并且需要使用新的映射创建新的类。
@全部
可能有可能在GisObject类的XML配置文件中编写我自己的自定义查询,然后在数据访问类中使用来获取该查询。
string qs = getSession().getNamedQuery(queryName);
并使用字符串replace注入数据库名称(通过替换一些占位符字符串),我将其作为参数传递。
qs = qs.replace(":tablename:", tableName);
我们如何看待该解决方案?我知道在不受控制的环境中这可能会带来安全风险,在该环境中,表名将作为用户输入来获取,但是在这种情况下,我有一个元表,其中包含我将在之前阅读的GIS数据类的正确和有效的表名调用查询以获取特定GIS对象类的数据。
回答
我想问一个问题,为什么我们要直接在数据库中处理GIS数据,而不使用通常为我们提供的抽象API。如果这是ESRI系统,则可以使用一些工具来将静态数据库视图创建到其GIS对象中,然后从那时开始,它可能适合数据提取。
回答
从NHibernate文档中,我们可以使用一种继承映射。
我们可能还为每个表都有一个单独的类,但是让它们都实现一些通用接口