代码之家  ›  专栏  ›  技术社区  ›  zappan

(N) Hibernate—是否可以将多个表动态映射到一个类

  •  2
  • zappan  · 技术社区  · 17 年前

    我的情况是,我使用GIS软件,该软件将GIS对象的信息存储到每种类型/类别的GIS对象(道路、河流、建筑、海洋等)的单独数据库表中,并保存元数据表,在元数据表中存储有关类名及其DB表的信息。

    我面临的问题是,如何使用NHibernate映射这些对象,以便在创建要接收和接收的C#GisObject时向NHibernate解释 它将从元表中读取(可以分为两个步骤,第一步我可以手动获取表名,然后在提取GisObject数据时将其传递给NHibernate)。

    有人处理过这种情况吗?能做到吗?

    6 回复  |  直到 17 年前
        1
  •  1
  •   Brian Chiasson Brian Chiasson    17 年前

    听起来最简单的方法可能是创建一个包含所有公共GIS成员的抽象基类,然后继承其他X类,这些X类只包含必要的NHibernate映射。然后,我将使用工厂模式使用元数据创建特定类型的对象。

        2
  •  1
  •   zappan    17 年前

    不幸的是,它不是创建所有GIS数据类的选项,因为类是在应用程序中动态创建的。相同类型的每个GIS数据都应该是一个类,但是我的用户可以获得新的数据集并将其放入数据库中。我不知道我的用户将在应用程序中使用哪些类。因此,前面的每类映射模型不起作用,因为明天将有另一个新的数据库表,并且需要使用新映射创建新类。

    @全部 有可能在GisObject类的XML配置文件中编写自己的自定义查询,然后在数据访问类中使用

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

    并使用字符串replace注入数据库名称(通过替换一些占位符字符串),我将把它作为参数传递。

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

    你觉得这个解决方案怎么样?我知道,在不受控制的环境中,表名将作为用户输入获取,这可能会带来安全风险,但在这种情况下,我有一个元表,其中包含正确有效的GIS数据类表名,我将在调用查询以获取特定GIS对象类的数据之前读取这些表名。

        3
  •  0
  •   lomaxx    17 年前

        4
  •  0
  •   sirrocco    17 年前

    你可以看看Ayende在这里说什么: MultiTable Entities .

    但既然你们有单独的桌子,我认为这行不通。 你也可以退房 nhuser group

        5
  •  0
  •   MotoWilliams    17 年前

    我想我会问一个问题,为什么您直接在数据库中查找GIS数据,而不使用通常作为抽象提供给您的API。如果这是一个ESRI系统,则有一些工具允许您将静态数据库视图创建到其GIS对象中,然后从那时起,可能适合进行数据提取。

        6
  •  0
  •   Eric Lathrop    17 年前

    从NHibernate文档中,您可以使用 inheritance mappings .

    对于每个表,您可能也有一个单独的类,但是让它们都实现一些公共接口