问题标签 [table-per-subclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
513 浏览

fluent-nhibernate - 流畅的 NHibernate 和每个子类的继承

我有一个 Base 类和两个孩子(A:Base 和 B:Base),我想将它们映射到两个表(表 A 和表 B)。这在 Fluent NHibernate 中可行吗?所以我有:

我的映射是:

但在这种情况下,它会创建三个表(A、B 和 Base)。这很好,但我需要减少表的数量,所以我可以在 A 和 B 表中都有 Base 的字段。通常我想简单地将 A 和 B 映射为普通类(不使用继承),但我需要能够添加一些其他类,我可以在其中拥有属性:

如果我删除 BaseMap 定义并将 A 和 B 映射为 ClassMap<> 如果我尝试使用上面编写的属性,则会收到错误“找不到 Base 的地图定义”。

0 投票
1 回答
424 浏览

performance - 在专业项目中如何处理与 TPC 继承映射的多态关联?

在使用 Entity Framework 设计和开发以数据为中心的项目时,我花了太多时间来寻找一种方法来完成以下任务之一,但没有遇到任何实际问题。

  1. 找到实现“多态关联”的替代方法,该方法不能与EF 中的“TPC 继承映射”一起实现- 因为这种继承映射非常适合我的模型的逻辑设计,或者
  2. 找到一种方法来改善“TPT 继承映射”的性能不佳,这在我看来是 TPC 的唯一实用替代方案。

在我看来,“TPH 继承映射”从“数据库设计”和“数据验证”的角度来看是没有意义的。

此外,由于项目的其他部分几乎完全依赖于 Microsoft 产品,因此我不倾向于切换到其他 ORM 框架,例如 NHibernate。

现在我想请教那些可能遇到过这个问题的专业软件开发人员,请告诉我任何其他可用的选项/解决方案。在专业设计/开发任务中通常如何解决这个问题?

提前感谢任何指导

0 投票
1 回答
868 浏览

c# - nhibernate fluent映射延迟加载派生类

是否可以在 nhibernate/fluent 中为每个具体映射获取一个表来发出数据库语句以确定类的类型,然后发出另一个语句来获取详细信息,而不是在一个巨大的左连接 uber 语句中加入所有子类表。

换句话说,子类详细信息可以“延迟”加载。

我有一个使用流利的 nhibernate 和 ClassMap/SubClassMap 映射类映射的类层次结构。每个派生类(无论如何大多数)都有自己的表。所以这是每个具体类的表。

我没有指定鉴别器值,因为它们在所有子类都包含在同一个表中时使用。然而,我在基类表中有一个整数值,指示它是哪种类型。nhibernate 是否能够使用此数据并为派生类数据发出延迟加载。鉴别器值是数据库中的整数,对应于基类中的枚举。

例子。

0 投票
2 回答
3226 浏览

java - 使用特定子类查找行的条件查询

我将从一个经过消毒的示例开始。

在我的系统中,我有 Car 类。Car 有很多字段,其中有 GearShift 类的 gearShift 实例。

GearShift 是一个抽象类,AutomaticShift 和 StickShift 继承自该类。这在 Hibernate 中被映射为每个子类的表。

现在,假设我想获得具有自动换档功能的汽车。我更喜欢通过 Hibernate 标准来做到这一点,所以我想像我可以添加一个“ofType”限制,如下所示。

这有可能吗?

0 投票
1 回答
1252 浏览

fluent-nhibernate - Fluent NHibernate 自动映射类约定未应用于整个类层次结构

我正在尝试使用 Fluent Nhibernate 自动映射一个简单的继承层次结构,并且我需要为每个表使用与其类稍有不同的名称(下划线而不是 Pascal 大小写)。这似乎是一个使用约定的明显地方。我也想使用 table-per-subclass 策略,但这种组合似乎给我带来了一个问题:该约定仅适用于层次结构的基类。

这是我的自动映射:

我希望我的类如何映射(类名-> 表名):

我实际得到的是:

如您所见,实际上只更改了基类。这是我现有的约定,以便您可以看到我是如何定义它的:

我还查看了ISubclassConvention界面,并且看不到那里可以调整表的名称(这很有意义,子类并不总是在它们自己的表中)。

如果我从我的自动映射中删除该IncludeBase行,名称就会变成我想要的,除了它变成每个具体类的表。我想使用每个子类的表,将所有公共数据留在一个共享基表中。

我可以为每个名称添加覆盖,如果必须,我会添加,但我宁愿不这样做。

看起来这应该是一个明显受支持的行为。如何将命名约定应用于层次结构中的每个表,而无需逐个具体类进行表?

0 投票
1 回答
769 浏览

nhibernate - NHibernate 命名查询,每个子类都有表

我有一个项目,我们只使用命名查询来访问数据库。最近我们创建了新实体,我们计划按照子类模式映射表,所以我们按照文档创建了映射,一切看起来都很好,除了我们找不到如何在命名查询中定义表别名以便加载每个子类。

这是我们迄今为止所做的:

实体:

映射:

我们试图执行的查询是这个:

这会导致 nhibernate 生成以下 SQL:

如您所见,它正确检测子类并尝试加载仅属于子类的字段 PedalType 但由于没有具有别名[Gear]_1_.的表,因此查询失败...

我们已尝试与踏板表进行连接,但我们无法找到正确的方法来设置别名,使其转换为[Gear]_1_.

有什么帮助吗?

0 投票
1 回答
666 浏览

hibernate - Hibernate、子分类和访问者模式

我可能使用了错误的词,所以当我说业务对象(BO)时,我的意思是一个类,它引用了一个类,该类通过 Hibernate 以及业务逻辑映射到一个数据库表。

我面临的问题是在不使用反射或 instanceof 的情况下为子类实例化正确的 BO。

例如,假设我有一个 Pen-table,其中只有一个引用 Animal-table,而 Animal-table 又有两个子表 Cat 和 Dog(都是一对一的引用)。这些类看起来有点像这样:

然后我只是与 BO 一起在 BO 的 get 方法中像这样实例化它们:

然后我使用这样的类:

这是我正在研究的 getAnimalBO 方法。我希望它根据 Pen 的 Animal-instance 返回正确的 BO 实例。

我“可以”使用 instanceof 检查当前 Pen 中的实际 Animal,但这显然不漂亮。我正在考虑的另一种选择是使用反射来获取类名并在之后添加“BO”并获取它的实例,但是它也很丑陋。

我尝试在 getAnimalBO 周围包装另一个访问者模式,但它无法选择正确的访问方法而不进行强制转换,我不想将接受方法添加到非 BO 类。

如果没有聪明的方法让该方法有效地工作,那么核心问题是什么?我还没有真正找到 Hibernate 的任何最佳实践。Hibernate 和访问者模式的一些示例只是将接受方法添加到映射的类中,这不是很好......

0 投票
1 回答
2521 浏览

nhibernate - 关联引用未映射 - 每个子类策略按表映射的对象集合

我在使用 NHibernate 映射时遇到问题,我不确定我是否犯了一个菜鸟错误,或者我是否遇到了 NHibernate 的限制

我有三个域对象与关联的映射 hbm.xml 文件
Person
SpecialPerson
PersonCategory

SpecialPerson 派生自 Person

并且 PersonCategory 拥有一组 SpecialPersons <== 这就是让我感到悲伤的原因

当我尝试创建会话时,我得到一个 NHibernate.MappingException 说“关联引用未映射的类:SpecialPerson”

要么我没有使用正确的语法,因为我不应该指定 table 属性,但是当我尝试引用派生类型或
NHibernate 不允许对象保存派生的集合时类型,除非该派生类型根据具体的类继承映射策略映射到表中。任何人都可以启发我吗?

0 投票
1 回答
1034 浏览

entity-framework - 代码优先 - 鉴别器为 NULL 或 NOT NULL 时的映射

我想在 EF5 Code First 中使用 TPH 继承。我想基于数据库中的列是否为空。

我发现这个链接表明它在 EF4 中是不可能的。实体框架 4 - 特征 CTP5(代码优先)中的 TPH 继承与“IS NULL”鉴别器

这是否已在 EF5 中修复?如果是这样,语法是什么?

0 投票
1 回答
275 浏览

c# - 不调用 ToTable 时,EF 如何映射非抽象基类型?

我将 EF5 代码优先与实体类一起使用,如下所示:

然后我配置派生实体如下:

然后在我的应用程序中调用:

此调用的预期行为是什么?

奇怪的是,对于以完全相同的方式配置的层次结构,我似乎得到了不一致的行为。有时这会失败,因为它尝试查询“dbo.Base”,有时它正确查询“dbo.Derived”。