Спящий режим с использованием DetachedCriteria с интерфейсами - PullRequest
0 голосов
/ 03 января 2012

Используя Hibernate 3.6.8.Final и Spring 3.0.5.RELEASE, я пытаюсь добавить некоторые общие функции DAO для классов, которые имеют несколько реализаций, переопределенных выше, для реализации определенных классов, однако это не работает для DetachedCriteria.

Пример:

В базовом классе:

public interface ICat {
    public void setMeowSound(String meow);
    public String getMeowSound();
}

Тогда каждый унаследованный проект будет определять аннотации гибернации.

например,

@Entity
@Table(name="SQUAWKY_CATS")
public class SquawkyMeowingCat implements ICat, Serializable {
    @Id
    @Column(name="SQUAWK_NAME")
    private String meow;

    public String getMeowSound() {
        return meow;
    }

    public void setMeowString(String meow) {
        this.meow = meow;
    }
}

Это означает, что я могу использовать:

Criteria criteria = Session.createCriteria(ICat.class);

И Spring / Hibernate знает, что он извлекает аннотации для ICat из конкретного наследования в конкретном проекте.

Однако, если я пытаюсьсделать:

DetachedCriteria subQuery = DetachedCriteria.forClass(ICat.class,"inner"); // etcetera

затем я получаю неизвестную сущность во время выполнения для ICat.

Теперь это имеет смысл, так как в первом случае создается его вне сеанса, поэтому он имеет всю конфигурациючто ему нужно, тогда как DetachedCriteria является статическим методом, однако он выдает ошибку при попытке выполнить

criteria.list()

, когда он выбрал сеанс и должен знать, чтоНа самом деле ICat - это SquawkyMeowingCat, в котором есть все аннотации.

Итак, мои вопросы состоят из двух частей:

1) Является ли это известным поведением и навсегда останется таким же?2) Кто-нибудь может придумать простой способ обойти это без использования интерфейса и конкретного ClassHolder, который возвращает экземпляр класса, который ему нужно создать?

1 Ответ

0 голосов
/ 05 января 2012

Я не уверен насчет случая DetachedCriteria, но одним из способов избежать явной зависимости от конкретного класса может быть запрос метаданных Hibernate с помощью интерфейса:

public <T> Class<? extends T> findEntityClassForEntityInterface(
    SessionFactory sessionFactory, 
    Class<T> entityInterface
) {
    for (ClassMetadata metadata : sessionFactory.getAllClassMetadata().values()) {
        Class entityClass = metadata.getMappedClass(EntityMode.POJO);
        if (entityInterface.isAssignableFrom(entityClass)) {
            return entityClass;
        }
    }
    return null;
}

С обычными предостережениями об устойчивости иллюстративных кодовых всплывающих окон.

...