問題描述:
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();
清空緩存。