我有一种方法可以从哈希映射中删除值而不删除键。
HashMap的结构如下,注意Kennel和Dog都是Java对象:
Map<Kennel, List<Dog>> mapOfKennels;
在我的下面的方法中,我循环遍历我的数据库中的所有狗窝和狗,并从狗舍中删除了狗(使用Crud Repository),这些狗已被所有者带回家(前面在代码中定义的逻辑)。
我只想要从单个狗舍中删除所有或没有(即交易)的狗时,从我的数据库中删除狗,即HashMap的每次迭代
我可以在哪里放置@transactional
方法?
当前代码:
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 :(得分: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方法在一个单独的类中,否则事务无法正常工作。