У меня есть следующий код, который обычно хорошо работает:
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
ответственным? Или мой код удаления прослушивается?