質問
2つのEJB 3エンティティBeanがあります:
@Entity
public class Organisation
{
@Id
@Column(length = 64)
private String guid;
private String name;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinColumn(name = "home_unit_fk", nullable = true)
private Unit homeUnit;
}
@Entity
public class Unit
{
@Id
@Column(length = 64)
private String guid;
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "organisation_fk", nullable = false)
private Organisation organisation;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_unit_fk", nullable = true)
private Unit parentUnit;
@OneToMany(mappedBy = "parentUnit", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@OrderBy("shortName")
@OptimisticLock(excluded = true)
private Set<Unit> childUnits;
}
標準のDaoを使用して組織で削除を行う場合:
public int deleteByGuid(final String guid)
{
final Query query = entityManager.createQuery("delete from " + getPersistentClass().getName() + " where guid = :guid");
query.setParameter("guid", guid);
return query.executeUpdate();
}
しかし、次の例外が発生します:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:親行を削除または更新できません:外部キー制約が失敗します( config
。 unit
、CONSTRAINT FK27D184F5D4393D
外部キー( organisation_fk
)参照 organization
( guid
))
わかりません。何が間違っていますか? JPA / Hibernateは、同じトランザクション内でユニットと組織の両方で削除を実行すべきではありませんか?
解決
一括削除クエリはオブジェクトをメモリにロードせず、関連付けで指定されたカスケードをバイパスします。
削除メソッドを次のようにコーディングします:
public int deleteByGuid(final String guid){
Organization org = entityManager.find(Organization.class, guid);
entityManager.remove(org);
}
クエリを使用して一括更新を行う場合、操作はデータベースに直接委任されます。子オブジェクトを削除する場合は、「データベース」でDELETE CASCADEトリガーを設定する必要があります。レベル。
オブジェクトをロードして削除することにより、Hibernateは&quot; object&quot;でカスケードをトリガーします。レベル。
所属していません StackOverflow