问题标签 [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 回答
138 浏览

hibernate - Hibernate - 继承

我有一个名为的超类userDetailsSuper,它映射到另一个名为Address.

当我尝试插入子表时,数据被插入到子类和超类中,但不在映射地址类中。

我想我错过了一些映射......请帮忙

0 投票
2 回答
351 浏览

nhibernate - NHibernate Table Per Subclass 导致无意义的 INSERT 语句 - 我做错了什么?

我有以下实体:

我使用以下 Hibernate Conformist 映射映射这些实体:

EnumCustomType是将IUserTypeC# 枚举映射到整数列的一个。

经过大量研究和咨询 NHibernate 参考文档和此博客(特定页面)(摘要)后,我制定了此设计和映射。我确信这是我想要的实体设计,但当然有可能(可能?)我弄错了映射。

当我启动并配置 NHibernate 时,它​​会加载映射并且不会抱怨。日志输出没有关于映射的警告。但是,当我创建 a 时PersonUser,将值分配给它的所有属性,并将Add其分配给ISession,最奇怪的事情发生了:

重要的是,看看生成的 SQL:

这是没有意义的。它根本不对应于映射。它在一个表的插入语句中从三个不同的表中获取列。它有来自PersonUserAND 的列ClientUser(这应该是不可能的),它使用不存在的参数索引绑定参数,甚至不包括我设置的所有属性!

我已经玩了几个小时了,没有任何进展。我在这里完全不知所措。这没有任何意义。有人见过这个吗?知道发生了什么吗?

编辑我忘了提:我在这里使用鉴别器是因为我希望能够User通过它的 ID 获得一个泛型,它返回正确的PersonUserClientUser取决于它是哪种类型。

0 投票
1 回答
936 浏览

jpa - @OneToMany 关系属性未填充

我已经实现了Joined, Multiple Table Inheritance

有一个“父”表pois和两个子表:xPoisyPois,反过来我有一个抽象的PoiDao类以及一个XPoiDao和一个扩展PoiDao的YPoiDao类。

一个 poi 可能有多个预留,但一个预留只属于一个 poi。

在子表 DAO 中定义的命名查询适用于在相应(直接)表层次结构中定义的属性。父表与另一个名为reservations的表有外键关系(表reservations保存表pois的外键)。问题是未获取此预订表中的记录。

在 MySql Workbench 中运行这个 SQL 语句可以获得所需的结果集:

在 Eclipse 中,当我在调试模式下检查 xDao 实例时,我可以看到{IndirectList: not instantiated} 。

如何使用 JPA 从此表中获取存储在 PoiDao 中的记录?

0 投票
1 回答
130 浏览

c# - 禁用更新子类的可能性

我正在开发流利的 nhibernate 中的继承策略。一切正常,但我有一个问题。是否有可能通过子类禁用更新基础属性?

这是一个虚拟代码:

当我更新 objectB 时,我不想更新 StatusA。我想在更新 ObjectA 时更改状态 A。nhibernate有这种功能吗?它有道理吗?

编辑:附加 说明我想做这样的事情的原因是在我的系统(asp mvc 应用程序)中,我们有两个不同的地方来管理objectsA 和objectsB。首先我们创建对象 A,然后我们想将对象 A“转换”为对象 B。然后我们可以在两个不同的模块中编辑这两个对象。

我编辑objectB的流程: -从db读取objectB,将其转换为viewmodel -从视图发布表单,将视图数据从表单转换为objectB并在db中更新。

我不想为对象 A 的数据扩展对象 B 的视图模型,将这些数据存储在一些隐藏字段中并从视图模型转换。

我认为如果可以标记 Session.SaveorUpdate(objectB) 无法更新此数据,它将解决我的问题。所以基本上这就是我的问题。

0 投票
1 回答
521 浏览

c# - 在 NHibernate 中获取每个子类的表对象

我遇到了一个名为 ScheduledJobs 的数据库表,其中包含大量列和一个匹配的 C# 对象,具有相等的大量属性。我对它的设计并不感到兴奋,并想使用每个子类的表策略来分解它。代替

我有

我重写了 NHibernate .hbm.xml 文件(没有流利,抱歉)来使用:

伟大的!我的麻烦是,我不知道如何明智地获取子类作业。一张大桌子的好处是不必担心类型或转换:

在我的设置中,我有相同的 ID(这应该足够了;它仍然是唯一的),但我不知道类型:我必须获取抽象作业,检查 JobTypeID,找到关联的 C# 子类,然后重新获取它子类。

如果需要,我可以引入 JobTypeID。我仍然必须将该 ID 与与之关联的作业子类表配对。

简而言之,我需要能够让我从 NHibernate 收到的 ScheduledJob 对象成为正确的子类,而我的干预尽可能少。在这里使用鉴别器的能力会很棒,但官方文档说不允许这样做。这种设计让我觉得我从根本上误解了一些东西;随时指出我正确的方向。

谢谢!

0 投票
2 回答
1312 浏览

java - 每个类和单表混合的 Hibernate 继承表

我正在开发在线网上商店,我需要有关 Hibernate 映射的帮助。我有以下继承:

我想要的:
1) id、name、description 等常用字段将在@MappedSuperclass BaseProduct 中。
2)乐器类型(吉他,鼓)将具有这些类型的乐器的共同字段。
3)最后,具体类 AvGuitar、ElGuitar 等将具有此具体乐器的独特属性。

最大的问题是我希望有两个表用于两种类型的乐器:t_guitar 和 t_drum(InheritanceType.TABLE_PER_CLASS),对于具体类,一个表 InheritanceType.SINGLE_TABLE,这意味着将有一个表用于原声和电吉他以及一张带有相应判别列的声学和电鼓表。

我怎样才能做到这一点?谢谢!

更新 1

由于我需要将整个层次结构作为一种通用类型进行交互并将产品映射到另一个实体,因此我执行了以下操作:

中级产品:

因此,使用此解决方案,不幸的是,任何混合仍然不起作用。

0 投票
0 回答
660 浏览

java - 使用 @Inheritance 和 Joined 策略的休眠错误“找不到对象”

我有 3 个与 Hibernate 一起正常工作的 Java 类(BaseEntity、User、Role)。User 和 Role 都是 BaseEntity 的子类。我有一个用于我的用户的表和一个用于我的角色的表。有一个用于将用户映射到角色的连接表。所有使用的注解都是javax.persistence注解。

由于各种原因,我需要扩展我的模型并为角色创建一个超类。这个超类需要有一个自引用。我的想法是在此处将 @Inheritance 注释与连接策略一起使用,但我不断收到来自 Hibernate 的错误。从我读到的 Hibernate 应该明白,它需要进行连接才能从超类中获取属性。

我得到的错误:

[警告] [18:30:04.004] [] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误:-5501,SQLState:42501 [错误] [18:30:04.004] [] org.hibernate.engine .jdbc.spi.SqlExceptionHelper - 用户缺少权限或找不到对象:ROLE1_.NAME

休眠 SQL 输出:

我正在使用休眠 4.2.19

如您所见,Hibernate 试图从权限表中选择 name 属性的值,这是正确的,但随后抱怨该表上不存在该列。

我该如何解决这个问题?

0 投票
0 回答
1283 浏览

hibernate - 无法按子类策略使用 JPA 表保存记录

我有一个父实体和两个子实体。ReportDetails 是我的父实体,ReportBarChart 和 ReportPieChart 是我的子实体。以上三者共享一些共同领域。因此,在保存详细信息的同时,我在 JPA 中使用每个子类策略的表。但是在设置父实体值之后,同时保持实体出现以下错误。

我的实体是

报告详细信息.java

报告饼图.java

请帮助解决此问题。

0 投票
1 回答
166 浏览

java - 在线图书馆/商店设计实现选择的休眠继承

我希望在休眠中实现一个在线库。这是我的 sql 架构:

sql模式

在书籍和编程书籍之间,我正在考虑对每个加入的子类使用类型表的休眠继承。我以这种方式设计了 sql 模式,因为我看不到在 10 个表中重复相同的列的意义。也许我需要添加一个更常见的列,我不想在 10 个表中这样做。但这意味着每当某处需要一本书时,所有子表之间都会建立一个巨大的连接(我只有 2 个,但我可以有 50 种书籍类型!!!)。例如,如果我有一家网上商店,同样的情况也适用:我会有产品、电视、笔记本电脑、电话等......)。

什么设计可以帮助我避免这种行为?

我的想法是:

  • 我可以复制所有子表中的所有列,因此,根本不使用继承,将它们视为不同的实体。这里唯一的事情是我将不得不绑定其他表(作者等)的每个特定书表
  • 我可以避免使用继承,保留当前的 ​​sql 模式但使用单向关联( ProgrammingBook 有 Book 等)

你们推荐什么选择?

亲切的问候,

0 投票
1 回答
57 浏览

c# - 具有相同 id 的每个子类的表对象在缓存中发生冲突

我需要使用 Fluent NHibernate 映射旧表。我无法控制表结构。

该表如下所示:

我正在尝试使用每个子类的表结构使用TypeId.

当我尝试在Cat 1之后加载时会出现问题Dog 1,反之亦然。

如果我在取第二只动物之前驱逐第一只动物,它会起作用。

当我将 aDog和 a都映射Cat到我的AnimalHome班级时,我得到以下异常:

无法转换类型为“MyNamespace”的对象。Dog ' 输入 'MyNamespace. '。

这让我相信缓存并没有区分Dog它们Cat的类型。它只是认为它是Animal 1and that Cat 1equalsDog 1

我可以以某种方式让缓存考虑实际的子类吗?或者,如果这对于每个子类的表结构是不可能的,我应该如何映射这个表?