Предположим Таблица на отношения наследования подкласса, которые могут быть описаны рев (Из 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 {
}
У меня есть сценарий, где я просто должен получить Родительский класс. Из-за проблем производительности, Что я должен сделать для выполнения запроса HQL для получения Родительского класса и просто Родительского класса, не загружая подкласса???
Обходной путь описан ниже:
Определите ваш класс 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
Обновление: Похоже, первый вариант не работает, как я думал.
Укажите класс в предложении where:
select p from Project p where p.class = Project
Использовать явный полиморфизм, который можно установить с помощью аннотации Hibernate @Entity
:
@javax.persistence.Entity
@org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
@Inheritance(strategy = InheritanceType.JOINED)
public class Project {
@Id
private long id;
...
}
Это что в документации Hibernate Core написано о явном полиморфизме :
Неявный полиморфизм означает, что экземпляры класса будут возвращены запросом, который называет любые суперкласс, реализованный интерфейс или класс, и эти экземпляры любого подкласса класса будут возвращены запросом, который называет сам класс . Явный полиморфизм означает , что экземпляры класса будут возвращаться только запросами, которые явно называют этот класс.