0

EMF で実装され、teneo/hibernate/MySQL で永続化されたかなり複雑なドメイン モデルがあります。モデルのサブツリー (「包含」という意味でのサブツリー) があり、サブツリーの要素はサブツリーの外部から参照されません (サブツリーに「包含」されている要素から、サブツリーに「包含」されている他の要素への参照のみ)。サブツリー)。

サブツリーを削除し、それが含まれているコレクションからルート要素を削除したいと考えています。すべての参照がサブツリー内にあるため、問題なく動作することを期待しています。とにかく、MySQL から外部キー違反が発生したという例外が発生します。したがって、削除は失敗します。削除プロセスは機能すると予想されますか? それとも、teneo/hibernate は、要素を正しい順序で削除するほど賢くないのでしょうか?

例外メッセージ:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`ide`.`equip_equipment`, CONSTRAINT `equip_equipment_usagedomain` FOREIGN KEY (`component_ud_id`) REFERENCES `ud_component` (`id`))

更新: 私のカスケード ポリシーは次のとおりです。

hibernateProperties.setProperty(PersistenceOptions.CASCADE_POLICY_ON_CONTAINMENT, "ALL");
hibernateProperties.setProperty(PersistenceOptions.CASCADE_POLICY_ON_NON_CONTAINMENT, "REFRESH,PERSIST,MERGE");
hibernateProperties.setProperty(PersistenceOptions.INHERITANCE_MAPPING, InheritanceType.SINGLE_TABLE.getName());
hibernateProperties.setProperty(PersistenceOptions.ADD_INDEX_FOR_FOREIGN_KEY, Boolean.TRUE.toString());
4

1 に答える 1

0

削除 (削除) 操作をカスケードするように関連付けを構成した場合にのみ機能します。

@OneToMany(cascade = CascadeType.REMOVE)
private Set<Child> children;

このカスケードがない場合、親エンティティを削除すると、この特定のエンティティのみが削除されます。もちろん、すべての子が親への外部キーを持っているため、制約違反の例外が発生します。

于 2012-06-06T09:30:30.640 に答える