gpt4 book ai didi

java - Hibernate 中@MappedSuperclass 对继承映射有什么好处?

转载 作者:行者123 更新时间:2023-12-02 02:23:43 26 4
gpt4 key购买 nike

根据Hibernate docs , MappedSuperclass 允许映射继承,其中父类(super class)不被视为实体,并且不支持通过基类获取对象的多态查询。

另一方面,table per class策略在数据库中生成的模式方面是相似的,除了它将父类(super class)映射到表(如果它不是抽象的)。但是它支持多态查询。

我的问题是:为什么会有人使用@MappedSuperclass 策略?如果将父类视为一个实体,是否会隐含性能问题?对此有任何想法表示赞赏。

最佳答案

  1. @MappedSuperclass
  • 默认情况下,父类(super class)的属性会被忽略并且不会持久化!您必须使用 @MappedSuperclass 注释父类(super class)使其属性能够嵌入到具体的子类表中。

  • 您可以使用 @AttributeOverride 在子类中覆盖来自父类(super class)的列映射注释或多个 @AttributeOverrides .

  • 您可以在父类(super class)中声明标识符属性,为所有子类使用共享的列名和生成器策略,这样您就不必重复了。 但它是可选的!

  • 隐式继承映射的主要问题是它不能很好地支持多态关联。在数据库中,您通常将关联表示为外键关系。如果子类都映射到不同的表,则不能将与其父类(super class)的多态关联表示为简单的外键关系。

  • 返回与查询类接口(interface)匹配的所有类实例的多态查询也存在问题。 Hibernate 必须作为多个 SQL 对父类(super class)执行查询 SELECT s,每个具体子类一个。

  • 此映射策略的另一个概念性问题是不同表的几个不同列共享完全相同的语义。这使得模式演变更加复杂。例如,重命名或更改父类(super class)属性的类型会导致更改多个表中的多个列。您的 IDE 提供的许多标准重构操作都需要手动调整,因为自动过程通常不会考虑像 @AttributeOverrides 这样的事情。 .这也使得实现适用于所有子类的数据库完整性约束变得更加困难。

因此,对于类层次结构的顶层来说,这种方法是一个不错的选择,通常不需要多态性的地方,以及修改父类(super class)的时候 future 不太可能。

  1. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
  • 数据库标识符及其映射必须出现在父类(super class)中,以便在所有子类及其表中共享它。这不再是可选的,因为它是 @MappedSuperclass映射策略。

  • 请注意,JPA 标准指定 TABLE_PER_CLASS是可选的,因此并非所有 JPA 实现都支持它。实现也依赖于供应商——在 Hibernate 中,它等同于 <union-subclass>在旧的本地 Hibernate XML 元数据中映射。

  • 如果我们检查多态查询,这种映射策略的优势就会更加明显。这些表与 UNION 运算符组合,并在中间结果中插入文字; Hibernate 读取它以在给定特定行的数据的情况下实例化正确的类。联合要求合并的查询转换在相同的列上;因此,您必须用 NULL 填充不存在的列。您可能会问这个查询是否真的比两个单独的语句执行得更好。在这里,您可以让数据库优化器找到最佳执行计划来组合来自多个表的行,而不是像 Hibernate 的多态加载器引擎那样在内存中合并两个结果集。

  • 另一个更重要的优势是处理多态关联的能力。 Hibernate 可以使用 UNION查询模拟单个表作为关联映射的目标。

因此,当您需要使用多态查询和关联时,这种方法是一个不错的选择。

附言这几乎是对优秀书籍的逐字引用:Java Persistence with Hibernate(Bauer、King、Gregory)

关于java - Hibernate 中@MappedSuperclass 对继承映射有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66045230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com