我在持久存储模式下使用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方法获得的列表有关。看起来你不能第二次遍历同一个列表吗?以下几点似乎行不通:
// 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());
}输出(第一次执行)
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类
模型类
@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);
}
}仓库
@RepositoryConfig(cacheName = "ItemCache")
public interface ItemIgniteRepository extends IgniteRepository<Item, Long> {
}SpringBoot应用程序
@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();
}
}发布于 2021-07-03 14:31:30
这个问题与“删除”或“点燃”本身无关。相反,春季数据CrudRepository在默认情况下返回一个Iterable<T>,根据规范,该Iterable<T>只能使用一次。
public interface CrudRepository<T, ID> extends Repository<T, ID> {
...
/**
* Returns all instances of the type.
*
* @return all entities
*/
Iterable<T> findAll();
}该问题的一个常见解决方案是在存储库接口中定义自己的"findAll“方法,该方法返回列表类型。
@RepositoryConfig(cacheName = "ItemCache")
public interface ItemIgniteRepository extends IgniteRepository<Item, Long>, CustomItemIngniteRepository {
...
@Override
public List<Item> findAll();
}此后,它的工作如期而至。您可以对同一个结果对象进行第二次迭代。
输出
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... XXXXXXXXXXXhttps://stackoverflow.com/questions/68143588
复制相似问题