2016-05-18 4 views
-1

キーを削除せずにハッシュマップから値を削除する方法があります。HashMapの各反復がトランザクションであることを保証する方法

次のようにHashMapの構造があり、ケンネルと犬の両方のJavaオブジェクトである点に注意してください。

Map<Kennel, List<Dog>> mapOfKennels; 

を私の方法では、私はCRUDを使用して(私のデータベース内のすべての犬小屋や犬をループして犬を削除しています下回ります所有者によって家に持ち帰られた犬舎からのものである(これについては前出のコードのロジック参照)。

私だけつまり私が行うには、私の@transactional方法を置くことができるのHashMap

の各反復、全か無(つまり、トランザクション)は、単一の小屋から削除されたときに、私のDBから犬を削除したいそう?

現在のコード:

public void deleteDogsFromKennels(Map<Kennel, List<Dog>> mapOfKennelsAndDogs) { 


     //For each Kennel in the Map 
     for (Map.Entry<Kennel, List<Dog>> entry : mapOfKennelsAndDogs.entrySet()) { 

       String key = entry.getKey().getId(); 
       List<Dog> dogList = entry.getValue(); 

       //For each Dog in Kennel 
       for (int i = 0; i < dogList.size(); i++) { 

        dogRepository.delete(dogList.get(i)); 


       } 
      } 

     } 
+0

@ememChitsigaが回答で言ったように、コードをリファクタリングしたくない場合は、**メソッド**レベル、すなわち 'deleteDogsFromKennels()'または**クラス**レベルで '@ Transactional'を追加してみてください以下。それはうまくいくはずです。 –

答えて

2

各犬小屋の除去は、専用のメソッドによって処理されるようにコードをリファクタリング。次に、@Transactionalアノテーションをこのメソッドに追加します。 DogRepository

@Transactional 
public class DogRepository{ 

    public void deleteDogs(List<Dog> dogs){ 
     //delete all dogs 
    } 
} 

でたとえば次に、あなたのクライアントコード

public void deleteDogsFromKennels(Map<Kennel, List<Dog>> mapOfKennelsAndDogs) { 
    //For each Kennel in the Map 
    for (Map.Entry<Kennel, List<Dog>> entry :mapOfKennelsAndDogs.entrySet()){ 
     String key = entry.getKey().getId(); 
     List<Dog> dogList = entry.getValue(); 
     try{ 
      dogRepository.deleteDogs(dogList); 
     } 
     catch(Exception ex){ 
      //log failed to delete kennel with key 
     } 
    } 
    } 

にdeleteDogs方法はdeleteDogsFromKennels方法として、別のクラスであることを確認してくださいそれ以外の取引は、仕事を文句を言いません。

関連する問題