我需要为某些表的多个未指定字段创建一个事务并执行 .insertInto()。我有一个问题,即事务成功运行,但没有存储记录。我认为root子句没有正确执行 .insertInto()方法或 DSLContext 与包装器配置失败交互。我会非常感谢任何建议。
我在两个类中有两个方法(表处理和DAL)。 Fisrt用于事务创建和发送到DAL类字段以进行插入。第二,DAL-class,用于插入新字段。
public Boolean insertToMainDB(List<TableForMainDb> mainTables) throws AppDataAccessLayerException {
Boolean InsertTransactSuccessFlag = false;
try {
TransactionalCallable <Boolean> transactional = new TransactionalCallable<Boolean>() {
@Override
public Boolean run(Configuration configuration) throws Exception {
for (TableForMainDb table : mainTables) {
table.getRecorder().recordToDB(table, configuration);
}
return true;
}
};
InsertTransactSuccessFlag = context.transactionResult(transactional);
} catch (DataAccessException ex) {
throw new AppDataAccessLayerException(ex);
}
return InsertTransactSuccessFlag;
}
DAL类中的第二个方法:
public boolean recordToDB(TableForMainDb mainDBtable, Configuration configuration) {
boolean InsertFlag = false;
for (String key : mainDBtable.fields.keySet()){
//using(configuration).
insertInto (
table(mainDBtable.getTableName())
,field(mainDBtable.fields.get(key).getFieldName())
,value(mainDBtable.fields.get(key).getFieldValue())
).attach(configuration);
InsertFlag = true; //TBD
}
return InsertFlag;
}
事务成功运行,但记录未插入数据库。
在调试模式下,我看到 DSLContext 和配置的对象已满,并包含插入日期(字段)的记录。 转储如下。上下文中的交易字段= false。
配置 DefaultConfiguration [ 连接=真, 交易= TRUE, 方言= POSTGRES, 数据= {org.jooq.configuration ....}, 设置= ...
DSLContext DefaultConfiguration [ 连接=真, 事务=假, 方言= POSTGRES, 数据= {}, 设置= ...
答案 0 :(得分:0)
您永远不会在Query.execute()
声明
Insert
答案 1 :(得分:0)
感谢Lukas的评论以及伟大的JOOQ。
我们将insert实现为
.insertInto(Table<Record>, Fields[], Object[] ).execute()
我们将字段作为Field []和值的数组准备为Object []的数组,然后将其传递给 .insertInto()
fieldsAndValuesObject 它是字段和值的包装类的对象(添加/获取/设置)。
DSL.using(configuration).insertInto(DSL.table(tableName),
fieldsAndValuesObject.getArrayAllFields())
.values(fieldsAndValuesObject.getArrayAllValues()
)
.execute();