问题描述:
JavaFX客户端程序中,TableView组件通过mybatis从数据库获取数据并展示,在TableView中对数据作临时修改后,希望放弃修改并重新从数据库加载数据。此时加载数据,发现仍为修改过的临时数据。
详细说明:
在JavaFX中,通过mybatis获取数据,并加载到TableView组件中
private TableView<Data_SC_CZX_BGJ> dataTableView;
private void loadData() {
dataTableView.getItems().clear();
MyBatisHandler mybatisHandler = MyBatisHandler.INSTANCE;
Data_SC_CZX_BGJ_Mapper mapper = (Data_SC_CZX_BGJ_Mapper) mybatisHandler.getSqlSession()
.getMapper(Data_SC_CZX_BGJ_Mapper.class);
List<Data_SC_CZX_BGJ> dataList = mapper.getDataListByStatusId(statusid);
dataTableView.getItems().addAll(dataList);
}
在TableView中对数据作临时修改
tableColumn_1.setCellFactory(TextFieldTableCell.forTableColumn(new DoubleStringConverter()));
tableColumn_1.setOnEditCommit((col) -> {
Data_SC_CZX_BGJ data = (Data_SC_CZX_BGJ) col.getTableView().getItems()
.get(col.getTablePosition().getRow());
data.setGj(col.getNewValue());
});
临时修改后,再次执行loadData()方法,发现加载的数据为修改后的数据。
数据库中的数据仍是修改前的数据,说明mybatis取得的数据和数据库中不一致,初步怀疑是缓存问题。
问题分析:
List<Data_SC_CZX_BGJ> dataList = mapper.getDataListByStatusId(statusid);
mybatis获取数据后,将List对象放在了sqlSession缓存中,此时,我们通过
dataTableView.getItems().addAll(dataList);
此行代码将获取到的ArrayList加载到TableView中,此处是加载的List对象引用,List对象还在sqlSession的缓存中。
因此,当对TableView中的数据进行临时修改时,改动的数据直接作用到了缓存中的List对象。
当再次执行loadData方法时,sqlSession直接返回了缓存中的数据,导致出错。
解决方案为,在获取sqlSession前,通过
sqlSession.clearCache();
清空缓存。