问题标签 [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 投票
3 回答
2106 浏览

java - 具有不同主键的休眠继承

我正在尝试使用 TABLE_PER_CLASS 策略创建继承,但我想为每个表设置不同的主键是否可能?

我有一个类 Register 有数百万个实例,其中一些实例是“特殊的”,并且对于它们的列和额外的列有不同的规则。

对于基本寄存器,我不需要 Id 属性,因为我有一个唯一的列,但对于专门的实体,该列不是唯一的,所以我添加了一个额外的属性。

问题是hibernate正在使用父ID创建一个复合主键(生成的模式是):

列是正确的,schama 是我想要的,但我想从 PotencialRegister 主键中删除“id”成员。

0 投票
1 回答
3591 浏览

java - 具有不同 Id 名称的每个类继承的 JPA 表

我有以下映射:

而我想要实现的是查询不同的表来检索Car实体Bus。为此,我创建了以下 Spring Data 存储库

并尝试像这样使用它:vehicleRepository.findAll();

但是,在这种情况下,我得到java.sql.SQLSyntaxErrorException: ORA-00904: "KEY": invalid identifier. 似乎与for字段@Inheritance一起使用不起作用。@AttributeOverride@Id

我想指出的是,如果CarBus实体具有相同的映射,@Id它将完美地工作(但事实并非如此:“car_id”和“bus_id”)

另外,我尝试将@Id字段从Vehicle类移动到子类,但结果证明每个字段都@Entity应该包含一个@Id.

我还想提一提的是,我尝试过使用@MappedSuperclass而不是,@Inheritance但在这种情况下,我无法使用abstact Vehicle类型进行查询。

有人可以帮我吗?

谢谢

0 投票
1 回答
416 浏览

hibernate - Spring data JPA + TABLE_PER_CLASS 多态保存一对多

我有这些课程:

我正在使用级联。

当我试图坚持他们时。我得到:SqlError,没有表“车辆”

我想澄清一下,我一直坚持使用一种车辆的车库

所以当我点击时,garageRepository.save(garage) 我希望子表(汽车或卡车)被填充。并且garage_id 将是新车库。

如何才能做到这一点?

问候,伊多

0 投票
2 回答
472 浏览

spring - 在具有 Inheritancetype.TABLE_PER_CLASS 的实体上使用 JPARepository 会导致错误查询

我使用继承类型“TABLE_PER_CLASS”在我的项目中定义了 2 个实体。之后,我定义了 2 个存储库来访问数据,但是,当我使用它们查找 B 实体的记录时,生成的查询不包含 JOIN 语句,而仅包含“SELECT id, name, alternate_name from b”,它失败了,因为“名称”字段不存在。

我错过了什么我看不到的东西吗?

实体 A:

实体 B:

基础存储库:

存储库:

B存储库:

0 投票
1 回答
40 浏览

c# - 使用 Table-Per-Concrete-Type 继承果园模型?

我知道 Orchard 中使用的底层 ORM 是 NHibernate,它确实支持所谓的ClassMapping可能有助于按照我们想要的方式自定义映射。

但是我不确定 Orchard 如何利用 NHibernate 支持的映射方法。在这种情况下,它似乎总是使用类似于Table Per TypeEF 以及其他一些 ORM 的策略。使用该策略,基类将映射到某个公用表,而派生类将映射到另一个表,该表包含其自己的所有属性(未在基类中声明)。这两个表将具有一对一的关系。

现在我真的想让它使用类似于Table Per Concrete Type将基类和派生类映射到两个不同的表的策略,其中所有属性(包括继承的属性)都映射到列。这 2 个表不会有任何关系,因此仅在一个表中查询列不会意外生成内部 JOIN(针对一对一关系)。

实际上,如果我们只需要对数据进行分区(从 1 个大表到 2 个或更多具有相同架构的小表),这个要求是有意义的。我们不想重新声明或使用某种重复的模型类(具有不同的名称),相反,我们只需要创建一个新的模型类并让它从一个包含所有必要属性的基本模型类继承。

使用这样的当前代码:

目前我们不能使用BRecord,因为它被理解为 的另一部分ARecord,自动生成的查询(总是使用 INNER JOIN)会因为某些不存在的表或列名而失败。

我该如何解决这个问题?

0 投票
1 回答
242 浏览

java - 如何将两个抽象 InheritanceType.TABLE_PER_CLASS 实体与 OneToMany 关系映射?

我将 Hibernate 与 Spring Boot 和 JPA 一起使用,并且有一个业务需求来检索并组合到存储在数据库中四个不同表中的单页响应数据中。

让我们称前两个表为“tblCredits”,包含 Credits,和“tblDebits”,包含 Debits。出于我们的目的,这两个表是相同的——相同的列名、相同的列类型、相同的 ID 字段,所有内容。我的端点应该能够返回贷方和借方的组合列表,能够通过返回的任何/所有字段进行搜索/排序,并具有分页功能。

如果我控制了该数据库,我只需将两个表合并到一个表中,或者创建一个视图或存储过程来为我执行此操作,但这是其他应用程序使用的遗留数据库,我无法在任何文件中修改方式,所以这不是一个选择。

如果我不需要排序和分页,我可以只创建两个完全独立的实体,为每个实体创建一个单独的 Spring Data JPA 存储库,分别查询这两个存储库,然后将结果组合到我自己的代码中。但是特别是对合并结果进行分页会变得非常麻烦,除非我绝对必须这样做,否则我不想自己实现合并的分页逻辑。理想情况下,我应该能够让 JPA 开箱即用地为我处理所有这些。

我已经能够使用声明为具有 InheritanceType.TABLE_PER_CLASS 的实体的抽象类来实现前两个表的第一步,如下所示:

然后两个扩展该抽象实体并简单地指定两个不同表映射的具体类,根本没有特定于类的属性或列映射:

到目前为止一切都很好,这很好用,我能够在 AbstractCreditDebitEntity 实体上创建一个 Spring JPA 存储库,在这两个表上生成联合查询的引擎盖下,我能够从一个表中获取两个表的记录查询,具有适当的分页和排序。(关于联合查询的性能问题目前并不关心我。)

但是,当我合并另外两个表时,下一步我会被绊倒。tblCredits 与 tblCreditLineItems 具有一对多关系,而 tblDebits 与 tblDebitLineItems 具有一对多关系。同样,从我们的角度来看,tblCreditLineItems 和 tblDebitLineItems 是相同的表 - 相同的列名、相同的列类型、相同的 ID 字段,所有内容。

因此,对于这些子实体,我可以遵循与以前相同的模式:

但现在我需要创建 Credit/Debit 实体和 CreditLineItem/DebitLineItem 实体之间的映射。这就是我挣扎的地方。因为我需要能够根据关联的 CreditLineItem/DebitLineItem 实体中的属性值过滤我返回的特定 Credit/Debit 实体,所以我需要两个实体之间的双向映射,但我一直无法让它工作成功地。

这是到目前为止我已经走了多远。首先是三个 Credit/Debit 实体,其 OneToMany 映射到其关联的 CreditLineItem/DebitLineItem 实体:

然后三个 CreditLineItem/DebitLineItem 实体及其多对一映射返回到 Credit/Debit 实体:

但是,此代码可以编译...当在我的自动化测试中我尝试保留我的 Credit 实体之一(我使用简单的 H2 数据库进行自动化测试)时,我收到以下错误:

它似乎试图基于从我的 AbstractCreditDebitEntity 类到我的 AbstractCreditDebitLineItemEntity 的@OneToMany 映射来坚持。其中,由于它是具有 InheritanceType.TABLE_PER_CLASS 的抽象类,因此没有为它指定表,因此它假定它需要持久保存到的表与该类具有相同的名称。

我想在这里发生的是 Credit 子类中具体 getter 上的 @OneToMany 映射,它将其 targetEntity 指定为具体 CreditLineItem.class,以从本质上覆盖/替换其父抽象类上的 @OneToMany 映射。但似乎具体类的映射被完全忽略了?

我可以从 AbstractCreditDebitEntity 类中完全删除 @OneToMany 映射,并且只在扩展它的两个具体 Credit/Debit 实体中定义该映射。这使得持久性错误消失,并且 90% 的测试用例通过了......但在这种情况下,当我尝试根据以下字段之一过滤或排序从组合 AbstractCreditDebitEntity Spring Data JPA 存储库返回的结果时CreditLineItem/DebitLineItem 子实体中存在,由于 AbstractCreditDebitEntity 不再具有到 AbstractCreditDebitLineItemEntity 的任何映射,查询失败。

有没有什么好的方法可以解决这个问题,使得从 AbstractCreditDebitEntity 到 AbstractCreditDebitLineItemEntity 的 OneToMany 映射仍然存在,但是 Credit 实体专门映射到 CreditLineItem 实体和 Debit 实体专门映射到 DebitLineItem 实体的知识也保持不变?

0 投票
0 回答
32 浏览

c# - 对 EF6 使用哪种继承策略感到困惑(CodeFirst)

我对实体框架的代码优先方法的继承策略有疑问。

目前我必须在我们的数据库中实现各种问题表。

这是我当前的 QuestionBase 类,它具有每种问题所需的所有属性。

目前我只有两种不同类型的问题:SingleChoice 和 MultipleChoice。这些类型之间的唯一区别是导航属性,如下所示:

我当前的方法导致每个层次结构继承表。一旦我添加了一个包含附加属性的新问题类型,QuestionBase 表就会被附加列扩展。这不是我想要的。

每个类型的表继承不是一个选项,因为我不知道将来会添加多少不同的问题类型。恐怕,不同问题类型的数量可能会导致性能问题。

每个具体类继承的表也不是我想要的。

我还考虑过不使用继承,而是使用外键和导航属性。但后来我意识到,至少我的前两个问题类型会导致仅针对 QuestionBase 表具有外键的附加表,因为它们没有其他属性。这似乎不对。

可能还有其他方法我可以尝试吗?

0 投票
1 回答
271 浏览

sql - 在 PostgreSQL 中处理鉴别器列的最佳方法是什么?

我们有一个涉及大量多态/继承/子类型的数据库模式。某些外键(例如评论主题或权限目标)指向大量表,某些属性(例如全局唯一代码)由多个表共享。

我们构建这种结构的方式是通过每个类的表继承,其中父表和子表共享一个 UUID 主键。选择 UUID 以便可以合并和分离表以适应业务需求,而不必担心冲突。

目前,父类型上没有明确的鉴别器列,但出于几个原因,我想添加一个。它将排除错误地将两个不同的具体子类型指向同一父类型的可能性。它还经常保存连接,因为通常不需要特定于子的数据,只需要知道哪个子类型与给定的 id 匹配。

我可以想到几种可能的方法:

  1. 只需使用存储具体子类型表名称的纯文本字段。

  2. 执行与上述相同的操作,但使用列出可能表的自定义 Enum 类型。

  3. 使用指向查找表的“id”字段。

(2) 似乎比 (1) 是一个更好的选择,但是它有一个相当大的缺点,即不允许我在没有大量迁移痛苦的情况下从 Enum 中删除一个值。如果这个鉴别器列出现在很多表上,这尤其痛苦,它很可能会出现。

(3) 通常用于“需要更改的枚举”,但是它需要将 UUID/int id 值硬编码到 DDL 中,以便正确处理子类型上的外键,这似乎有点破坏交易.

这让我倾向于(1),但我想知道是否有更好的选择。甚至可能是针对字符集非常有限的频繁重复标识符而优化的文本类型。

0 投票
1 回答
76 浏览

java - 使用每类表策略时如何提高 Hibernate 多态查询的性能?

当使用每类表策略时,多态查询如下所示:

我们可以看到,如果 entity_table1 和 entity_table2 中有很多行,则此查询可能会导致性能问题。

我正在使用 Spring-data & Hibernate,并且在获取父实体上的 OneToMany 关系时会生成此请求。

我的问题是:为什么 Hibernate 会生成这样的请求,尽管它限制了 entity_table1 和 entity_table2 共有的 parent_id 上的选定行?

有没有办法让 Hibernate 生成如下所示的 SQL 请求:

在 FROM 的每个请求中都有“WHERE parent_id=X”?这样在获取父实体上的关系时不会出现性能问题。

谢谢 !