Получение абстрактного суперкласса, сопоставленного представлением с использованием гибернации, возвращает недопустимое имя столбца

#java #oracle #hibernate

#java #Oracle #режим гибернации

Вопрос:

Ситуация следующая. Допустим, у меня есть ребенок, и я хочу получить его родителя. Абстрактный родительский элемент находится в представлении. Родителем может быть либо мать, либо отец. Материнский класс также определен в представлении.

 @Entity
public class Kid extends DomainObject {
    private IParent theParent;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Parent.class)
    @JoinColumn(name = "TheParentId")
    public IParent getTheParent() {
        return theParent;
    }

    @Override
    public void setTheParent(IParent theParent) {
        this.theParent = theParent;
    }
}

@Entity
@Inheritance(strategy= InheritanceType.JOINED)
@Table(name = "Parent")
public abstract class Parent {

}

@Entity
public class Mother extends Parent {

}
  

Итак, используя Hibernate, я пытаюсь получить материнский объект, вызвав getTheParent() для Kid:

 from Kid hobj left join  fetch  hobj.theParent pa
  

Это отлично работает в базе данных. Но при запуске этого через Hibernate возвращается исключение SQL: недопустимое имя столбца (НЕИЗВЕСТНО)

Есть несколько указателей, которые могут быть причиной. В старой базе данных Мать и отец были таблицами вместо представлений. Я предполагаю, что Hibernate понял ссылку из-за внешних ключей. Изменение родительского элемента из таблицы в представление привело к сбою приложения. Но поиск вокруг указывает на то, что Hibernate одинаково обрабатывает представления и таблицы (в некоторой степени). Почему получение точного запроса, используемого Hibernate, работает при непосредственном вводе, но не при использовании Hibernate?

Ответ №1:

Проблема, похоже, заключалась в предложении select запроса. При добавлении нескольких объектов в столбец выбора (запуск более глубокого с большим количеством таблиц, чем у Kid, Mother и Father), Hibernate может запутаться. Когда я использовал только дочерний объект (и заполнял элементы с помощью Kid.getX().getY().getZ() … ), у Hibernate не было проблем с извлечением всего.

Похоже, это ошибка в гибернации.