oracle下使用Db.batchSave()会提示无效的序列,解决方法直接上代码
#### 集成DbPro,覆盖batchSave方法
package com.seven.common;
import com.jfinal.plugin.activerecord.Config;
import com.jfinal.plugin.activerecord.DbKit;
import com.jfinal.plugin.activerecord.DbPro;
import com.jfinal.plugin.activerecord.Record;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author xuyanfeng
* @Description: TODO
* @date 2019/5/23
*/
public class RenzhiDbPro extends DbPro {
@Override
public int[] batchSave(String tableName, List<Record> recordList, int batchSize) {
if (recordList != null && recordList.size() != 0) {
Record record = recordList.get(0);
Map<String, Object> cols = record.getColumns();
int index = 0;
String pks = "";
StringBuilder columns = new StringBuilder();
Set<Map.Entry<String, Object>> entries = cols.entrySet();
for (Map.Entry<String, Object> e : entries) {
if (config.getDialect().isOracle()){
Object value = e.getValue();
if (value instanceof String && ((String)value).endsWith(".nextval")) {
//主键
pks = pks.concat(e.getKey()).concat(",");
continue ;
}
}
if (index++ > 0) {
columns.append(',');
}
columns.append(e.getKey());
}
if (pks.length() > 0){
pks = pks.replaceFirst(",", "");
}
StringBuilder sql = new StringBuilder();
List<Object> parasNoUse = new ArrayList();
config.getDialect().forDbSave(tableName, pks.split(","), record, sql, parasNoUse);
return this.batch(sql.toString(), columns.toString(), recordList, batchSize);
} else {
return new int[0];
}
}
}#### 创建MyDbProFactory实现IDbProFactory
package com.seven.common;
import com.jfinal.plugin.activerecord.DbPro;
import com.jfinal.plugin.activerecord.IDbProFactory;
/**
* @author xuyanfeng
* @date 2019/5/23
*/
public class RenzhiDbProFactory implements IDbProFactory {
@Override
public DbPro getDbPro(String configName) {
return new RenzhiDbPro();
}
}#### Arp设置
arp.setDbProFactory(new RenzhiDbProFactory())