通常はうまく機能する次のコードがあります。
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();
}
}
私のエンティティクラスの多くでは、これはうまくいきます。ただし、そのうちの 2 つは何もせず、例外をスローせず、オブジェクトを削除しません。休止状態からのログは、休止状態がいくつかの選択クエリを実行することを示していますが、削除を実行しようとさえしません。
他の同様の質問hereおよびhereで見つかった提案を既に試しましたが、役に立ちませんでした (まあ、後者は使用できないことを示唆していますが、ステートメントをと@Transactional
で囲んだだけです)。begin()
commit()
これらの 2 つのクラスが他のクラスより多い (または少ない) ものを見つけることができないようです。彼らは@PrimaryKeyJoinColumn
私が持っている他のほとんどすべてのエンティティ@OneToMany
と@ManyToOne
同じように使用します。正直に言うと、彼らには@OneToOne(optional = false)
別のクラスを参照するフィールドがあり、他のエンティティにはありませんが、理由がある可能性があると言われない限り、それを変更する (そしてその結果としてデータベース スキーマを変更する) という面倒なことはしません。それのための。
@OneToOne
責任者ですか?または、削除コードにバグがありますか?