Таблица на отношения наследования подкласса: Как запросить против Родительского класса, не загружая подкласса??? (Быть в спящем режиме)

Предположим Таблица на отношения наследования подкласса, которые могут быть описаны рев (Из 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 для получения Родительского класса и просто Родительского класса, не загружая подкласса???

7
задан Arthur Ronald 23 April 2010 в 17:44
поделиться

2 ответа

Обходной путь описан ниже:

Определите ваш класс 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

7
ответ дан 6 December 2019 в 23:03
поделиться

Обновление: Похоже, первый вариант не работает, как я думал.

Первый вариант:

Укажите класс в предложении 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 написано о явном полиморфизме :

Неявный полиморфизм означает, что экземпляры класса будут возвращены запросом, который называет любые суперкласс, реализованный интерфейс или класс, и эти экземпляры любого подкласса класса будут возвращены запросом, который называет сам класс . Явный полиморфизм означает , что экземпляры класса будут возвращаться только запросами, которые явно называют этот класс.

См. Также

4
ответ дан 6 December 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: