一尘不染

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

hibernate

假设 每个子类继承关系 如下所示(来自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类而不加载任何子类?


阅读 527

收藏
2020-06-20

共1个答案

一尘不染

解决方法如下所述:

将您的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特定的批注

2020-06-20