У меня есть 3 сущности:
Объект A, объект B, объект C.
public class Entity_A {
public List<Entity_B> entBList;
Some other objects...
@OneToMany(mappedBy="entityA", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, orphanRemoval=true)
@Fetch(value = FetchMode.SUBSELECT)
public List<GebruikerKind> getEntBList() {
return entBList;
}
}
public class Entity_B {
public Entity_A entityA;
public Entity_C entityC;
Some other objects...
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "COLUMNJOINNAME")
public Entity_A getEntityA() {
return entityA;
}
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "OTHERCOLUMNJOINNAME)
public Entity_C getEntityC() {
return entityC;
}
}
public class Entity_C {
public List<Entity_B> entBList;
Some other objects...
@OneToMany(mappedBy="entityC", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, orphanRemoval=true)
@Fetch(value = FetchMode.SUBSELECT)
public List<GebruikerKind> getEntBList() {
return entBList;
}
}
Обратите внимание: все сеттеры доступны, и есть много других доступных объектов :). Насколько я знаю, моя конфигурация хорошая.. Я пытаюсь удалить Entity_B:
Query query = getCurrentSession().createQuery(
"delete from " + Entity_B.class.getName() + " eb " +
" where eb.entityA.someField = :someField and eb.entityC.someOtherField = :someOtherField");
query.setString("someField", someId);
query.setString("someOtherField", someOtherId);
return query.executeUpdate();
Смуты в раю:
Hibernate бросает мне это SQLGrammarException: Неожиданный токен: Cross. Кто-нибудь знает, что я могу сделать?
Одним из решений является переписать запрос.
Вы можете избежать перекрестного соединения между eb.entityA и eb.entityC, написав SQL-запрос для извлечения идентификаторов, которые необходимо удалить. Затем вызовите HQL delete на каждом из этих идентификаторов.