私はあなたにうんざりさせる奇妙な問題があります。私は奇妙なSpring/Hibernateアプリケーションを持っています。これはデータベースを次のように管理することを目的としています(私はいくつかのことを単純化していますので、ソースコードに少し異なるテーブル/カラムがあることを混同しないでください)。Hibernate:親削除の子コレクションを削除しないでください
active_proxy_view table:
id | entity
<uuid> | <string containing json>
archive_proxy_view table:
id | entity
<uuid> | <string containing json>
track_reference table:
ref_type | ref_id | track_domain | track_type | track_id |
'proxy' | <uuid> | 'example.com' | 'customer' | '123' |
2つのテーブルを保持することは必須です - 私はすべての時間履歴/統計クエリとビジネス値クエリを現在アクティブなものに対してのみ持つ必要があるので、アクティブなプロキシを厳密に設定する必要があります。私はそのようなクエリを行うことができますので、track_reference
テーブルを検索するために使用されます。
(それはない100%正しいことも、私はしばらくの間で生のSQLの経験を持っていない)
そして、
- 両方
active_proxy_view
とarchive_proxy_view
エンティティが一つのクラスから継承され@OneToMany
関係0を指定しています。ここでの問題ですntrack_reference
実体;参照 track_reference
を追跡するに結ば多くの企業があるので@ManyToOne
使用量が個別に管理(これはあまりにも必須です)さを取り除くために休止状態私はtrack_reference
テーブルとは別にビューを管理する必要がありますが、私が言うたび- 、実際には不可能ですエンティティは
active_proxy_view
テーブルから、track_reference
のエンティティも削除します。デフォルトで空白のカスケード注釈値を再生しても、(私が理解するように、それは子レコードを親と一緒に削除しないでください)。しかし、私は何かを逃した可能性があります。私は春の4.3.2を通じて休止状態5.2.3.Finalを使用してい55 Query delete from tracking_reference where referenced_entity_id='13c6b55c-f9b7-4de7-8bd4-958d487e461c' and referenced_entity_type='proxy' and tracked_entity_type='agent' 55 Query delete from tracking_reference where referenced_entity_id='13c6b55c-f9b7-4de7-8bd4-958d487e461c' and referenced_entity_type='proxy' and tracked_entity_type='lead' 55 Query delete from tracking_reference where referenced_entity_id='13c6b55c-f9b7-4de7-8bd4-958d487e461c' and referenced_entity_type='proxy' and tracked_entity_type='source' 53 Query DELETE FROM `tracking_reference` WHERE `referenced_entity_type` = 'proxy' AND referenced_entity_id = '13c6b55c-f9b7-4de7-8bd4-958d487e461c' AND 1 = 0
:
- は、私はまた、私はまだ一般的なログに定期的に削除を確認することができ、カスタム
@SQLDeleteAll
を使用して、全体のことをハックすることができませんでした。リリース/スプリングデータJPA 1.10.2.RELEASE
TL; DR
親が削除されたときにHibernateが関連エンティティを削除するのを防ぐにはどうすればいいですか?あなたが@JoinColumn
を削除した場合、あなたはこの問題を持っていないはず
@NoRepositoryBean
public interface SuperRepository<E, ID extends Serializable> extends PagingAndSortingRepository<E, ID>,
JpaSpecificationExecutor<E> {
}
public interface ActiveProxyViewRepository extends SuperRepository<ActiveProxyViewEntry, String> {}
// the call for deletion
public CompletableFuture<Void> delete(ID id) {
...
descriptor.getRepository().delete(descriptor.getIdentifierConverter().convert(id));
...
}
// which is equal to
...
ActiveProxyViewRepository repository = descriptor.getRepository();
String uuidAsString = descriptor.getIdentifierConverter().convert(id);
repository.delete(uuidAsString);
...
エンティティを削除する方法を示すコードを含めてください。 – Naros
@Naros出来ましたが、それほど助けになるとは思えませんでした – Etki