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

每个子类的继承关系表:如何在不加载任何子类的情况下针对父类进行查询?(hibernate)

江航
2023-03-14
问题内容

假设 每个子类继承关系 如下所示(来自wikibooks.org-
参见此处)

注意父类 不是抽象的

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Project {

    @Id
    private long id;

    // Other properties

}

@Entity
@Table(name="LARGEPROJECT")
public class LargeProject extends Project {

    private BigDecimal budget;

}

@Entity
@Table(name="SMALLPROJECT")
public class SmallProject extends Project {

}

我有一种情况我只需要检索Parent类 。由于性能问题,我应该怎么做 才能运行HQL查询 以检索Parent类,而 获取Parent类而不加载任何子类?


问题答案:

解决方法如下所述:

将您的Parent类定义为 MappedSuperClass 。假设父类映射到PARENT_TABLE

@MappedSuperClass
public abstract class AbstractParent implements Serializable {

    @Id
    @GeneratedValue
    private long id;

    @Column(table="PARENT_TABLE")        
    private String someProperty;

    // getter's and setter's

}

对于每个子类,扩展AbstractParent该类并定义其 SecondaryTable 。父类中定义的任何持久字段都将映射到_SecondaryTable_ 定义的表。最后,如果需要,请使用AttributeOverrides

@Entity
@SecondaryTable("PARENT_TABLE")
public class Child extends AbstractParent {

    private String childField;

    public String getChildProperty() {
        return childField;
    }

}

并定义另一个实体,以仅检索父类

@Entity
@Table(name="PARENT_TABLE")
@AttributeOverrides({
    @AttributeOverride(name="someProperty", column=@Column(name="someProperty"))
})
public class Parent extends AbstractParent {}

没有其他的。如上所示,我仅使用了JPA特定的批注



 类似资料:
  • 问题内容: 假设 每个子类继承关系 的 表 如下所示(来自wikibooks.org- 参见此处) 注意父类 不是抽象的 我有一种情况 , 我只需要检索Parent类 。由于性能问题,我应该怎么做 才能运行HQL查询 以检索Parent类,而 只 获取Parent类而不加载任何子类? 问题答案: 解决方法如下所述: 将您的类定义为 MappedSuperClass 。假设父类映射到 对于每个子类,

  • 高尔夫球场示例:我们有类,,和。 这里有很多为人父母的事情。 必须由18条赛道组成,这在高尔夫球场是很正常的 但是我遇到了一个问题。当我尝试调用的构造函数时... ... 我必须同时通过和的实例,但是。。。 ... 这些函数的构造函数要求我传递一个的实例。我陷入了一个递归问题。 我可以通过不再让每个成为这些类的成员来“解决”这一问题,但这让人感觉很不舒服,就像糟糕的做法一样-没有理由不让它们成为f

  • 问题内容: 我想知道如何将某些函数返回的父对象转换为子类。 我不能更改A类。如果可以的话,我可以对A类实现functionIneed,但是由于代码的结构,这是不可能的。 问题答案: Python不支持“广播”。您将需要编写代码,以便它可以适当地进行初始化。

  • 问题内容: 在Django中,当您有一个父类和从其继承的多个子类时,通常可以通过parentclass.childclass1_set或parentclass.childclass2_set访问一个子类,但是如果我不知道我想要的特定子类的名称怎么办? 有没有一种方法可以在不知道子类名称的情况下沿parent-> child方向获取相关对象? 问题答案: (更新:对于Django 1.2及更高版本,

  • 我有一个母公司类别(工具),有三个子公司(股票、债券、Etf)。父类还与类(InstrumentPrice)有一个OneToMany关系。JPA联接策略用于父实体和子实体之间。当一个子项被持久化(例如Stock)时,工具中的一个条目也会自动持久化,并具有所有公共属性。这很好用。但是,如何为类InstrumentPrice创建条目?我是否必须在保存股票后从DB读取实体工具,并使用Instrument

  • 问题内容: 我正在考虑Hibernate管理的类层次结构的表布局,并且从某种意义上说,每个子类的表技术肯定是最合适的。但是,仔细考虑逻辑,我对它的性能有些担忧,尤其是随着子类数量的增加。 举一个非常简短(经典)的示例,假设您具有以下类: (我在取消getter和setter和Hibernate映射等,只是假设它们是基本的显而易见的情况)。 这些实体的数据库表很有意义,您可以很好地进行非规范化等等。