当前位置: 首页 > 面试题库 >

关于@ ForceDiscriminator / @ DiscriminatorOptions(force = true)的使用

班凌
2023-03-14
问题内容

在继承和多态关联的某些情况下,为什么@ForceDiscriminator或其等效项是@DiscriminatorOptions(force=true)必需的?这似乎是完成工作的唯一方法。有没有理由不使用它?


问题答案:

当我一次又一次地讨论这个问题时,我认为这可能有助于澄清:首先,的确,使用JOINED_TABLE映射时Hibernate不需要歧视。但是,使用时确实需要它SINGLE_TABLE。更重要的是,其他JPA提供程序也确实需要它。

当执行多态JOINED_TABLE查询时,Hibernate实际要做的是创建一个动态命名的鉴别器clazz,使用一个case开关,在外部连接继承树中涉及的所有表之后,检查具体子类唯一字段的存在。当您在中包含"hibernate.show_sql"属性时,您可以清楚地看到这一点persistence.xml。在我看来,这可能是JOINED_TABLE查询的理想解决方案,因此,Hibernate人士应该吹牛。

执行更新和删除时,此问题有所不同。在这里,hibernate首先在根表中查询与该语句的where子句匹配的任何键,然后pkTable从结果中创建一个虚拟键。然后,它"DELETE FROM / UPDATE table WHERE pk IN pkTable"为继承树的任何具体类执行一个;IN运算符会为O(log(N))每个扫描的表条目导致一个子查询,但它很可能在内存中,因此从性能角度来看还不错。

为了回答您的特定问题,Hibernate在这里根本看不到问题,并且从某种角度讲它们是正确的。对于他们来说,通过简单地@DiscriminatorValue通过在期间注入鉴别符值来兑现注释(entityManager.persist()即使他们实际上并未使用它们)将非常容易。但是,不承认其中的歧视项会JOINED_TABLE(对于Hibernate)具有创建厂商锁定的温和情况的优势,并且通过使用高级技术甚至可以辩护。

@ForceDiscriminator@DiscriminatorOptions(force=true)一定有助于减轻痛苦,但是您必须在创建第一个实体之前使用它们,或者被迫使用SQL语句手动添加缺少的鉴别符值。如果您敢于离开Hibernate,则至少要花费一些代码更改才能删除这些特定于Hibernate的注释,从而抵制迁移。显然,在这种情况下,这就是Hibernate所关心的。

以我的经验,供应商锁定是每个市场领导者最梦wild以求的天堂,因为正是手风琴魔术棒可以毫不费力地保护市场份额。因此,只要客户不进行反击并向卖方强加高于所获收益的价格,便会这样做。谁说开源世界会有所不同?

ps,只是为了避免造成任何混乱:我绝不隶属于任何JPA实现者。

pps:我通常要做的是忽略问题,直到迁移时间为止。然后,您可以SQL UPDATE ... FROM使用Hibernate用来填充缺失的鉴别符值的相同case-switch-with-outer-
joins技巧来制定一条语句。一旦了解了基本原理,实际上就很容易了。



 类似资料:
  • 问题内容: 我已经安装了python 2.7 64bit,MySQL-python-1.2.3.win-amd64-py2.7.exe。 我使用以下代码插入数据: 这导致将n打印为1,但在mysql客户端数据中不可见。 谷歌说我必须添加。 但是我不知道为什么MySQLdb将其关闭; 问题答案: 我不知道在GAE中使用自动提交是否有特定的原因(假设您正在使用它)。否则,您可以手动提交。 请注意,您可

  • force 方法用于数据集的强制索引操作,例如: Db::table('think_user')->force('user')->select(); 对查询强制使用user索引,user必须是数据表实际创建的索引名称。

  • 我试图使用递归来解决这个问题,获取所有连续的子数组,然后检查 给你一个正整数数组nums。计算并打印子数组中所有元素的乘积小于k的(连续)子数组的数量 此时我写了这部分代码: 但它不起作用...它现在正在打印“15”而不是“8”,用于: 感谢您抽出时间:)

  • 1.1. Rokid Force JS 使用指南 1.2. 使用JS脚本更快速地开发技能 1.2.1. 目录 1.2.2. 1. JS脚本基本内容 1.2.3. 2. response配置项 1.2.4. 3. 在Rokid对象中封装的工具 1.2.5. 4. 关于调试 1.2.6. 5. 关于日志 1.2.7. 6. Sample 1.2.8. 7. Q&A 1.1. Rokid Force J

  • 1.1. Rokid Force System 使用指南 1.1.1. 使用示例 1.1. Rokid Force System 使用指南 欢迎使用Rokid-Force-System来搭建skill后端服务。 为开发者能更灵活地配置skill服务,将原JS Engine服务解耦出skill配置,独立成为一个系统。 轻松切换技能功能; 随时编辑服务内容; 可选服务历史版本; Rokid-Force

  • 这个模块实现了用以模拟粒子物理运动的 velocity Verlet 数值积分器。仿真的演化: 它假设任意单位时间步长 Δt = 1,所有的粒子的单位质量常量 m = 1。作用在每个粒子上的合力 F 相当于在单位时间 Δt 内的恒定加速度 a。并且可以简单的通过为每个粒子添加速度并计算粒子的位置来模拟仿真。 在信息可视化领域,物理仿真在研究 networks 和 hierarchies 时非常有用