问题标签 [table-per-class]

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 投票
2 回答
1673 浏览

c# - 为什么 NHibernate 不能在每个具体类映射的联合子类表中使用身份?

一些消息来源指出,NHibernate 不能将标识与每个具体类和联合子类的表一起使用。这是真的吗,这背后的确切原因是什么?

0 投票
1 回答
978 浏览

.net - EntityFramework (CodeFirst) 继承映射:TPT 和 TPC 的混合

我们正在遗留数据库上制作 EntityFramework CodeFirst DAL (这意味着我们大多会遇到它所存在的任何设计错误)。

领域模型(非常)简单:我们有抽象 Card,子类型为 HomeCard、CarCard、OwnerCard 和 RenterCard。准确地说:

数据库模型紧随其后的是表 Cards、Homes、Cars、Owners 和 Renters,其中 Cards 包含公共列,而其他表包含与特定类有关的列。这正是 TPT 的含义,它完美地映射到 EntityFramework。

重构之后,我们发现(不出所料)Home 和 Car 确实共享一些属性,并且 Owner 和 Renter 也这样做。而且它不仅是为了美观,而且一些功能会更容易实现(例如按名称搜索所有者租户,或按所有者搜索房屋卡片)。所以我们希望我们的领域模型看起来像这样:

但是我们仍然有相同的数据库模型,这意味着我们在 TPT 和 TPC 之间有一些奇怪的混合。我们通过 EF/CodeFirst 映射它的所有尝试都失败了。关于使它工作的任何建议?

PS我们的基表 Cards 确实有一个鉴别器字段,如果这可能有帮助的话。

0 投票
1 回答
268 浏览

hibernate - 每个类和集合映射的休眠表

我将通过一个人为的示例来说明我的问题,以尽量使其简单易懂。但是我真正的问题是遗留代码,所以我不能更改架构或类似的东西。

我的代码中每个班级都有一个表格。假设 Customer1 和 Customer2。它们具有唯一的鉴别器值(分别为 1 和 2)。每个客户可以有 0 个或多个地址。地址存储在一个表中。此表存储对客户 ID 和客户鉴别器值的引用。在地址映射中,我有:

这可以。但是在我的 customer1 和 customer2 映射中,我有:

这有一个问题,即使用 id 1 加载 customer1 会为 id 2 的 customer2 获取任何地址。我最初的修复尝试是向集合中添加多个键:

但是,这样做时,我得到以下异常:

org.hibernate.MappingException:外键必须与引用的主键具有相同的列数)

有没有人对此有解决方案。有没有办法将描述符映射到类作为某种虚拟复合键?或者我可以用集合映射做些什么来将它限制在特定的客户表中?

0 投票
1 回答
539 浏览

linq-to-entities - Linq 到实体 TPC 和急切加载子类关系

谢谢你的想法

我正在使用实体框架 5.0,模型优先。

使用每个类的表(或每个具体类型的表)模式映射表。

表 A 1..许多(抽象)表 B

表 B 有 2 个子类

B1 & B2

B2 有第三个表的外键,比如说表 C(许多 B2 ... 1 C),但这不是父类 B 的属性。

急切加载是应用程序的默认设置,我想在查询表 B2 时包含表(或集合)C - 相当于(对实体的伪 linq):

感谢您对如何强制加载此表的任何想法

0 投票
1 回答
1803 浏览

jakarta-ee - @MappedSuperclass 上的实体侦听器不起作用?

背景

我正在使用 EclipseLink(版本 2.3.2.v20111125-r10461,JPA 2.0 规范的实现提供程序)。

考虑一下这个@MappedSuperclass,称为Person

他是抽象的,并附有一个听众(Listener )。这是监听器的实现:

然后我们有一个扩展Person的Employee类:

Employee仍然是抽象的,并不意味着被实例化。但是, Employee 被认为可能是关系的一部分,因此被注释掉了@Entity。层次结构继续使用名为PartTimeEmployee的非抽象实体

PartTimeEmployee旨在被实例化。让我们尝试一下,看看会发生什么!除了一个小细节外,一切似乎都很好。@MappedSuperclass 在Person上注册的实体监听器不会被调用。如果我们将@EntityListeners注释从Person向上移动到Employee ,甚至不会调用侦听器。

一个修复

@EntityListeners注释一直移动到PartTimeEmployee,他将被调用。唔。

另一个修复

如果我们完全省略Employee上的注释,我们可以保持在Person上注册的侦听器,并且侦听器将按预期调用。但是当然,我得到了一个我不想拥有的单桌策略。同样,我们可以更明确一点,将策略值从to更改为,然后将调用侦听器。当然,唯一的问题是我的数据库模式看起来不像我想要的那样。@InheritanceInheritanceType.TABLE_PER_CLASSInheritanceType.SINGLE_TABLE

因此,这里问题的核心是Employee@Inheritance类上的注释(更具体地说;将策略更改为每个类一个表),这使得 EclipseLink 忘记了层次结构中的所有实体侦听器。

这根本不是我所期望的。我不明白的是什么?

0 投票
1 回答
1784 浏览

jpa - 两个(每类表)继承树之间的双向一对多关系

抽象的

说,我有两个简单的@Entity 继承树(一个抽象基类,每棵树中有两个具体实现类) InheritanceType.TABLE_PER_CLASS; 我需要使用@JoinColumn 连接基类的双向@OneToMany 关系。

这应该产生四个表,每个具体类一个,对吧?EclipseLink 为其中一个抽象基类生成了第五个表,这对我来说没有意义。考虑这个例子(这不是一个真实的例子;它只是关于 JPA):

例子

Collection 是第一个继承树的抽象根和@OneToMany 关系的实现者:

PhysicalCollection 和 VirtualCollection 是 Collection 的具体实现:

Media 是第二个继承树的抽象根和@ManyToOne 关系的实现者:

CdMedia 和 TapeMedia 是 Media 的具体实现:

结果

正如我所说,EclipseLink 将由此生成五个表(不要介意 SEQUENCE 表):

并且意外的表 MEDIA 将有一个无用的定义(重命名 PhysicalCollection 时外键目标更改语义):

问题

  1. 我的预期是否正确?(创建 4 个表,而不是 5 个)
  2. 有人可以确认这是 EclipseLink 中的错误吗?
  3. 如果不是错误,你能指出我哪里出错了吗?
0 投票
2 回答
2713 浏览

grails - 使用 Table Per Subclass 时如何确保数据完整性?

我通过将我的超类中的静态字段的属性设置为 false 来使用Grails中的每个子类的表策略。这样,Grails 为我的超类创建一个表,并为我的每个子类创建一个附加表。tablePerHierarchymapping

然而,虽然超类和子类记录共享相同的 ID(主键),但没有外键约束来保持它们的一致性,即可以删除超类记录,使子类记录处于无效状态。我想知道是否有一个设置/属性可以让 GORM 以某种方式解决这个问题,例如通过约束。还是我手动添加外键的唯一选择?


例如,给定以下域类作为超类:

并将以下域类作为子类:

这导致创建两个表,Product表和Book表。当创建一本书时——例如,通过脚手架的页面——一条记录被插入到每个表中,它们唯一的链接是每个表的 ID 值相同的事实。具体来说,数据可能如下所示:

由于这些表没有在数据库级别定义正式关系,因此可能会删除其中一条记录而留下另一条记录,从而导致数据无效。显然,我可以使用 SQL 在两个 ID 字段上手动创建外键约束,但我希望让 Grails 处理它。这可能吗?


使用 Grails 2.2.1

0 投票
1 回答
642 浏览

inheritance - 每个具体类型外键的实体框架表

我有以下类层次结构

我正在尝试对每个具体类型层次结构映射使用 Table 并将以下代码用于 DataContext

实体框架仍然创建两个表。一个用于 B 类,包括外键的 Id 和 A_Id 字段。C 的第二个,除了对 A 的引用之外的所有字段。

是否可以配置 EF 不为 B 创建表?我想为每个派生类创建单独的表,但没有公用表。

0 投票
0 回答
150 浏览

java - JPA2.0 如何映射具有由 TABLE_PER_CLASS 映射的继承的实体集合

我想映射具有继承的实体的集合(映射)。实体和继承实体如下所示:

用作地图值的实体是这个

这是测试代码:

到目前为止一切正常。EclipseLink 将 TestEntity 和 SubEntity 放在一个表中,并带有一个用于区分类的鉴别器列。并且完整的地图数据存储在 MapValueEntity 的表中。现在,如果我将映射策略从默认(= SINGLE_TABLE)更改为 TABLE_PER_CLASS,则构造中断:

异常描述说:

字段 [MAPVALUEENTITY.MAP_KEY] 存在多个可写映射。只有一个可以定义为可写,所有其他必须指定为只读。

您是否看到在这种情况下使用 TABLE_PER_CLASS 策略的任何机会?哪里提到了“多个可写映射”?

0 投票
1 回答
104 浏览

nhibernate - NHibernate:将子类实体持久化到主表(每个类策略问题的表)

这不是一个问题,只是为了未来......(花了很多时间来弄清楚)

映射(流利的 NHibernate):

持久化 BMap 对象会导致异常:

例外:

内部异常:

这个不明显的异常表明发生了一些映射错误配置。实际上“选择”查询工作得很好。但是“插入”(ISession.SaveOrUpdate)会导致提到的错误。

使固定:

在 AMap 类中,您不需要该行:

删除此持久性后工作正常