繁体   English   中英

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

[英]JOOQ. How to record to DB with insertInto() a multiple fields in one transaction

我需要创建一个事务并为某些表的多个未指定字段执行.insertInto() 我有一个问题,即事务运行成功,但是没有存储任何记录。 我认为root子句不能正确执行.insertInto()方法,或者DSLContext与包装器Configuration交互失败。 我将非常感谢任何建议。

我在两个类中有两个方法(表处理和DAL)。 Fisrt用于创建事务并将其发送到DAL类字段以进行插入。 第二,DAL类,用于插入新字段。

    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;

}

事务运行成功,但记录未插入数据库。

在调试模式下,我看到DSLContextConfiguration的对象已满,并且包含用于插入日期(字段)的记录。 转储在下面。 上下文中的交易字段= false。

配置默认配置 [已连接=真,事务性=真,方言= POSTGRES,数据= {org.jooq.configuration ....},设置= ...

DSLContext DefaultConfiguration [已连接= true,transactional = false,方言= POSTGRES,data = {},设置= ...

您永远不会在Insert语句上调用Query.execute()

感谢Lukas的评论和出色的JOOQ。

我们实现插入为

    .insertInto(Table<Record>, Fields[], Object[] ).execute()

我们将字段准备为Field []的数组,将值准备为Object []的数组,然后将其传递给.insertInto()

fieldsAndValuesObject是字段和值(添加/获取/设置)包装类的对象。

            DSL.using(configuration).insertInto(DSL.table(tableName), 
                                        fieldsAndValuesObject.getArrayAllFields())
                                        .values(fieldsAndValuesObject.getArrayAllValues()
                                        )
                                        .execute();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM