У меня есть следующий код, который обычно хорошо работает:
public void delete(T object)
{
EntityManager em = getPersistence().createEntityManager();
EntityTransaction et = em.getTransaction();
try
{
et.begin();
object = em.find(object.getClass(), object.getId());
em.remove(object);
em.flush();
et.commit();
}
catch(Exception e)
{
error("Unable to delete " + object.toString() + ": there are references to it.");
}
finally
{
if (et.isActive()) et.rollback();
em.close();
}
}
Для многих моих классов сущностей это работает. Однако для двух из них он ничего не делает, он не бросает никаких исключений и не удаляет объект. Журнал из спящего режима показывает, что hibernate выполняет несколько запросов выбора, но даже не пытается выполнить удаление.
Я уже пробовал предложения, найденные в других подобных вопросах здесь и здесь, но безрезультатно (ну, последнее предлагает @Transactional, который я не могу использовать, но я просто заключил в себе выражения между begin() и commit()).
Я не могу найти, что эти два класса имеют больше (или меньше), чем другие. Они используют @PrimaryKeyJoinColumn так же, как и почти все другие объекты, которые у меня есть, они имеют @OneToMany и @ManyToOne точно так же, как ohters. Честно говоря, у них есть поле @OneToOne(optional = false), которое ссылается на другой класс, а другие объекты не имеют, но я бы не стал обсуждать проблему изменения этого (и, следовательно, изменения схемы базы данных), если вы не скажете мне, что можно быть причиной для этого.
Является ли @OneToOne ответственным? Или мой код удаления прослушивается?