#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 не было проблем с извлечением всего.
Похоже, это ошибка в гибернации.