首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >和Spring数据-如何删除一个实体?

和Spring数据-如何删除一个实体?
EN

Stack Overflow用户
提问于 2021-06-26 15:03:49
回答 1查看 224关注 0票数 0

我在持久存储模式下使用Apache和Spring数据(用SpringData2.2点燃2.9.1版本)。通过保存和读取对象可以工作得很好。但是,当我试图删除一个实体时,它也不会从存储中删除,因为我试图根据repo.deleteById()使用点火弹簧数据文档方法。

有什么暗示吗?谢谢

备注1: repo.deleteAll()工作正常。

备注2: DELETE FROM Item where Id = x在SQL中运行良好。

备注3:我将示例上传到github https://github.com/egloffmark/ignite-test/tree/master/ignite-test-map

备注4:我注意到它似乎与从repo方法获得的列表有关。看起来你不能第二次遍历同一个列表吗?以下几点似乎行不通:

代码语言:javascript
复制
        // query items
        log.info("first iteration, reading items...");
        Iterable<Item> items = itemRepo.findAll();
        // first iteration
        for(Item item : items) {
            log.info(item.toString());
        }
    
        // second iteration on same result object  <--- NOT WORKING !!!!
        log.info("2nd iteration,...");
        for(Item item : items) {
            log.info(item.toString());
        }

输出(第一次执行)

代码语言:javascript
复制
Started MyIgniteMapApplication in 4.437 seconds (JVM running for 4.673)
XXXXXXXXXXX  application started... XXXXXXXXXXX
Number of Items: 0
storing items...
1st iteration, reading items...
Item(id=1, name=Advanced Xtra Item, code=AIX-1, attributes={Price=3.9, Color=red})
Item(id=2, name=Advanced Hyper Item, code=AIX-2, attributes={Price=9.9, Color=blue})
Item(id=3, name=Advanced Biggest Item, code=AIX-3, attributes={Price=8.95, Color=pink})
2nd iteration,...
deleting items...
Number of Items: 3
XXXXXXXXXXX  application finished... XXXXXXXXXXX

模型类

代码语言:javascript
复制
@Data
public class Item {
    
    private static final AtomicLong ID_GEN = new AtomicLong();

    @QuerySqlField(index = true)
    private Long id;
    
    @QuerySqlField
    public String name;

    @QuerySqlField
    public String code;
    
    public Item(Long id, String code, String name) {
        this.id = id;
        this.code = code;
        this.name = name;
    }
    
    public Item(String code, String name) {
        this(ID_GEN.incrementAndGet(),code, name);
    }
}

仓库

代码语言:javascript
复制
@RepositoryConfig(cacheName = "ItemCache")
public interface ItemIgniteRepository extends IgniteRepository<Item, Long> {
}

SpringBoot应用程序

代码语言:javascript
复制
@SpringBootApplication(scanBasePackages = { "com.ontius.ignite.config" })
@Slf4j
public class MyIgniteApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(MyIgniteApplication.class, args);
    }

    @Autowired
    private ConfigurableApplicationContext applicationContext;

    @Autowired
    private ItemIgniteRepository itemRepo;

    @Override
    public void run(String... args) throws Exception {
        log.info("XXXXXXXXXXX  application started... XXXXXXXXXXX");

        long itemsCount = itemRepo.count();
        log.info("Number of Items: {}", itemsCount);
        if (itemsCount == 0) {
        
            // store some items
            Map<Long, Item> items = new TreeMap<Long,Item>();
            
            Item item = new Item("AIX-1","Advanced Xtra Item");
            items.put(item.getId(),item);
            
            item = new Item("AIX-2","Advanced Hyper Item");
            items.put(item.getId(),item);
    
            item = new Item("AIX-3","Advanced Ultra Item");
            items.put(item.getId(),item);
            log.info("storing items...");
            itemRepo.save(items);
        }
        
        // query items
        log.info("1st iteration, reading items...");
        Iterable<Item> items = itemRepo.findAll();
        // first iteration
        for(Item item : items) {
            log.info(item.toString());
        }
    
        // second iteration on same result object  <--- NOT WORKING !!!!
        log.info("2nd iteration,...");
        for(Item item : items) {
            log.info(item.toString());
        }
        
        // delete items <--- NOT WORKING !!!!
        log.info("deleting items...");
        for(Item item : items) {
            itemRepo.deleteById(item.getId());
        };
        itemsCount = itemRepo.count();
        log.info("Number of Items: {}", itemsCount);

        log.info("XXXXXXXXXXX  application finished... XXXXXXXXXXX");
        applicationContext.close();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-03 14:31:30

这个问题与“删除”或“点燃”本身无关。相反,春季数据CrudRepository在默认情况下返回一个Iterable<T>,根据规范,该Iterable<T>只能使用一次。

代码语言:javascript
复制
public interface CrudRepository<T, ID> extends Repository<T, ID> {
 ...
    /**
     * Returns all instances of the type.
     *
     * @return all entities
     */
    Iterable<T> findAll();
}

该问题的一个常见解决方案是在存储库接口中定义自己的"findAll“方法,该方法返回列表类型。

代码语言:javascript
复制
@RepositoryConfig(cacheName = "ItemCache")
public interface ItemIgniteRepository extends IgniteRepository<Item, Long>, CustomItemIngniteRepository {
   ...  
    
    @Override
    public List<Item> findAll();
    
}

此后,它的工作如期而至。您可以对同一个结果对象进行第二次迭代。

输出

代码语言:javascript
复制
XXXXXXXXXXX  application started... XXXXXXXXXXX
Number of Items: 0
storing items...
1st iteration, reading items...
Item(id=1, name=Advanced Xtra Item, code=AIX-1, attributes={Price=3.9, Color=red})
Item(id=2, name=Advanced Hyper Item, code=AIX-2, attributes={Price=9.9, Color=blue})
Item(id=3, name=Advanced Biggest Item, code=AIX-3, attributes={Price=8.95, Color=pink})
2nd iteration,...
Item(id=1, name=Advanced Xtra Item, code=AIX-1, attributes={Price=3.9, Color=red})
Item(id=2, name=Advanced Hyper Item, code=AIX-2, attributes={Price=9.9, Color=blue})
Item(id=3, name=Advanced Biggest Item, code=AIX-3, attributes={Price=8.95, Color=pink})
deleting items...
item: Item(id=1, name=Advanced Xtra Item, code=AIX-1, attributes={Price=3.9, Color=red})
item: Item(id=2, name=Advanced Hyper Item, code=AIX-2, attributes={Price=9.9, Color=blue})
item: Item(id=3, name=Advanced Biggest Item, code=AIX-3, attributes={Price=8.95, Color=pink})
Number of Items: 0
XXXXXXXXXX  application finished... XXXXXXXXXXX
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68143588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档