Mam następujący kod, który zazwyczaj działa dobrze:JPA/Hibernate usunąć podmiot czasami nie działa
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();
}
}
dla wielu z moich klas encji to po prostu działa. Jednak dla dwóch z nich nic nie robi, nie rzuca żadnych wyjątków i nie usuwa obiektu. Dziennik ze stanu hibernacji pokazuje, że hibernacja wykonuje kilka wybranych zapytań, ale nawet nie próbuje wykonać usunięcia.
Ja już próbowałem propozycje znajdujące się w innych podobnych pytań here i here, ale bezskutecznie (dobrze, to ostatnie sugeruje @Transactional
których nie mogę używać, ale ja po prostu zamknięty sprawozdań między begin()
i commit()
zamiast).
Nie mogę znaleźć tego, co te dwie klasy mają więcej (lub mniej) niż inne. Używają one @PrimaryKeyJoinColumn
, tak jak prawie wszystkie inne podmioty, które posiadam, mają one @OneToMany
i @ManyToOne
po prostu jak. Szczerze mówiąc, mają one pole @OneToOne(optional = false)
, które odwołuje się do innej klasy i że inne jednostki nie mają, ale nie będę przechodził przez kłopotów z ich zmienianiem (i w konsekwencji zmieniania schematu bazy danych), chyba że powiesz mi, że może być powodem tego.
Czy jest odpowiedzialny za @OneToOne
? Czy mój błąd kasowany jest błędnie?
Czy próbowałeś dodać kaskadę .ALL i orphanRemoval = true? – willome
@willome: to był tylko problem odwrotny, miałem "zbyt dużo" kaskadowania w miejscu, zobacz poniżej odpowiedź Steve'a Ebersole'a. –