【问题标题】:Inheritance strategy in Hibernate: making an entity abstract and replacing with sub classesHibernate中的继承策略:使实体抽象并用子类替换
【发布时间】:2010-07-09 07:25:46
【问题描述】:

我目前有现有的数据库和休眠映射。有一个中心表和相应的实体 (PersistentObject)。许多其他表和实体通过@ManyToOne@OneToOne 映射引用PersistentObject

现在我想将当前的PersistentObject 抽象化并引入两个子类Sub1ObjectSub2Object,它们继承自PeristentObject

我无法更改存储PersistentObject 的表,否则可以添加新表等。该表包含足够的信息,以便我可以使用例如 @DiscriminatorColumn 来分隔 Sub1ObjectSub2Object 行(如果需要)。

是否可以进行此更改,以便我当前的 HQL 查询无需修改仍可工作?我有很多查询,例如from PersistentObject where foo = ?from OtherEntity other where other.persistentObject = ?。我希望这些查询开始返回具体的子类而不是超类。我不想为Sub1ObjectSub2Object 编写单独的查询。

这有可能吗?我应该使用什么继承策略?

【问题讨论】:

    标签: java hibernate inheritance


    【解决方案1】:

    我无法更改存储PersistentObject 的表,否则可以添加新表等。该表包含足够的信息,以便我可以使用例如 @DiscriminatorColumn 来分隔 Sub1ObjectSub2Object 行(如果需要)。

    您可以使用JOINED 继承策略(带或不带鉴别器)。对于顶级:

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name = "DISC")
    public abstract PersistentObject {
    
        @Id @GeneratedValue
        private Long id;
    
        ...
    }
    

    例如:

    @Entity
    public class Sub1Object extends PersistentObject {
        ...
    }
    

    这不会更改现有表。

    是否可以进行此更改,以便我当前的 HQL 查询无需修改仍可工作?我有很多查询,例如from PersistentObject where foo = ?from OtherEntity other where other.persistentObject = ?。我希望这些查询开始返回具体的子类而不是超类。

    它们将工作并将返回扩展该类的所有持久类的实例。

    【讨论】:

    • 您确定 JOINED 策略应该与鉴别器列一起使用吗?我试过了,似乎从来没有设置鉴别器字段的值。
    • 我仔细检查过,Hibernate Core 支持它,见 9.1.3. Table per subclass: using a discriminator,JPA 规范提到了它,见 9.1.30 DiscriminatorColumn Annotation 部分,但 Hibernate Annotations 似乎忽略了它,见ANN-140
    • 感谢您查看。我真的很想将 JOINED 与鉴别器列一起使用。现在我必须使用 SINGLE_TABLE 继承和一个笨拙的映射到附加表。
    【解决方案2】:

    您必须使用 table-per-class-hierarchy 策略,因为您想使用鉴别器列 :) 至于我,休眠应该可以毫无问题地使用您所描述的内容。将子类映射为 hiberante 感知类并提供适当的鉴别器就足够了。

    请注意,有时 instanceof 指令不起作用,因为您将获得代理对象,但您可以使用 Hibernate.getClass(Obj...) 进行检查。

    【讨论】:

    • 谢谢。我不需要使用鉴别器列,它只是在需要时可用。
    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2016-11-03
    • 1970-01-01
    • 2011-04-19
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多