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