JOOQ。如何使用insertInto()在一个事务中记录多个字段到DB

时间:2015-11-18 15:02:54

标签: java sql transactions jooq insert-into

我需要为某些表的多个未指定字段创建一个事务并执行 .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,     数据= {},     设置= ...

2 个答案:

答案 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();