2017-03-06 3 views
3

でそれを見つけることができません:削除されたエンティティは、関連するエンティティのリストにあるが、私は次のコードを持っているリポジトリ

私は、関連するエンティティのリストでエンティティを削除見ることができるのはなぜ
@Transactional 
public void delete(String id) { 
    PersonEntity personEntity = personRepository.findOne(id); 
    //has one address with ID = 10  
    personEntity.getAddresses().stream().forEach(address -> addressRepository.delete(address.getId())); 
    PersonEntity personEntity2 = personRepository.findOne(id); 
    // not empty - I can see that are existing one address with ID = 10 
    personEntity2.getAddresses(); 
    // ID = 10, but here is null 
    addressRepository.findOne(10); 
} 

が、私は使用findOneこのIDの場合、メソッドはnullを返しますか?

答えて

3

以内にごdeleteあなたは人からすべてのアドレスを削除します。正確には、JPA管理コンテキスト外のアドレスを削除してください。そのため、addressRepository.findOne(10)(トランザクションがコミットされる前でさえ)を呼び出すときにはnullが得られます。なぜなら、それらのアドレスはJPAコンテキストなどに存在しないからです。トランザクションが最終的にコミットされると、アドレスはデータベースから消去されます(以前はありません)。

アドレスの人物リストからアドレスを消去しないので、参照されたエンティティにデータベースの対応するレコードがもうなくなっても(トランザクションがコミットされる前と後に)残ります。 。

データベースへの削除を再び反映させるには、トランザクションがコミットされた後にエンティティマネージャセッションが終了していない場合はentitymanager.refresh(personEntity)に電話をかけるか、personEntity = personRepository.findOne(id)に再度コールしてください。

より洗練されたソリューションは、@ Vikram Singhによって既に提案されました。これを働かせるには、orhapn removal = trueを使用して人から人へのrealtionをマッピングする追加の必要性@OneToMany(orphanRemoval = true

+0

私はアドレスを削除した後に 'findOne'と呼んだ。 'PersonEntity personEntity2 = personRepository.findOne(id); ' – ByeBye

+0

アドレスリストはまだ空ではないので、あなたの答えが正しいかどうか分かりません – ByeBye

+1

あなたは' PersonEntity personEntity2 = personRepository.findOne(id) 'をどこで呼びましたか? 'delete'メソッドの中では、アドレスはデータベースから削除されず、人はJPAコンテキスト内で変更されません(参照先アドレスのみが削除されます)。 。 トランザクションがコミットされた後で呼び出された場合、エンティティマネージャセッションが閉じられているかどうかによって異なります。そうでなければ、entitymanager.refresh()を試してください。もしそうなら、新しいセッションを開き、再度 'personRepository.findOne(id)'を呼び出します。 –

0

削除メソッドを呼び出さないでください。単にエンティティをリストから削除してください。 jpaはトランザクションが完了した後に削除を処理します。削除した後はentityManager.flush()を実行できます。 JPAの動作だけでどのようだ

+0

これは私の質問に対する答えではありません。私はこれをする方法を尋ねていない - 私は理由を尋ねている – ByeBye

関連する問題