当前位置: 首页 > 知识库问答 >
问题:

带有Spring Boot的jOOQ不插入实体

封永嘉
2023-03-14

我遇到了jOOQ不插入实体的问题,除非存储库用@Transactional注释。

这是我的配置:

@Configuration
@EnableTransactionManagement
@RequiredArgsConstructor
public class PersistenceConfig {

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String dbUser;

    @Value("${spring.datasource.password}")
    private String dbPassword;

    @Bean
    @SneakyThrows
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();

        // https://mariadb.com/kb/en/about-mariadb-connector-j/
        config.setDriverClassName(DatabaseDriver.MARIADB.getDriverClassName());
        config.setJdbcUrl(dbUrl);
        config.setUsername(dbUser);
        config.setPassword(dbPassword);
        config.setAutoCommit(false);

        // https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration
        config.addDataSourceProperty("cacheServerConfiguration", true);
        config.addDataSourceProperty("useServerPrepStmts", true);
        config.addDataSourceProperty("useLocalSessionState", true);
        config.addDataSourceProperty("cacheResultSetMetadata", true);
        config.addDataSourceProperty("rewriteBatchedStatements", true);
        config.addDataSourceProperty("elideSetAutoCommits", true);
        config.addDataSourceProperty("maintainTimeStats", false);
        config.addDataSourceProperty("cachePrepStmts", true);
        config.addDataSourceProperty("prepStmtCacheSize", 350);
        config.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);

        return new HikariDataSource(config);
    }

    @Bean
    public TransactionAwareDataSourceProxy transactionAwareDataSource() {
        return new TransactionAwareDataSourceProxy(dataSource());
    }

    @Bean
    public DataSourceTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider(transactionAwareDataSource());
    }

    @Bean
    public ExceptionTranslator exceptionTransformer() {
        return new ExceptionTranslator();
    }

    @Bean
    public SpringTransactionProvider springTransactionProvider() {
        return new SpringTransactionProvider(transactionManager());
    }

    @Bean
    public DefaultConfiguration configuration() {
        DefaultConfiguration jooqConfiguration = new DefaultConfiguration();

        jooqConfiguration.set(connectionProvider());
        jooqConfiguration.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
        jooqConfiguration.set(SQLDialect.MARIADB);
        jooqConfiguration.set(springTransactionProvider());

        return jooqConfiguration;
    }

    @Bean
    public DefaultDSLContext dsl() {
        return new DefaultDSLContext(configuration());
    }

    @Bean
    public TransactionTemplate transactionTemplate() {
        return new TransactionTemplate(transactionManager());
    }

    private static class ExceptionTranslator extends DefaultExecuteListener {
        public void exception(ExecuteContext context) {
            SQLDialect dialect = context.configuration().dialect();
            SQLExceptionTranslator translator
                = new SQLErrorCodeSQLExceptionTranslator(dialect.name());
            context.exception(translator
                .translate("Access database using jOOQ", context.sql(), context.sqlException()));
        }
    }

}

存储库:

@Repository
public class UserRepository extends UserDao {

    private final DSLContext dslContext;

    public UserRepository(DSLContext dslContext) {
        super(dslContext.configuration());
        this.dslContext = dslContext;
    }
}

因此,调用userRepository。插入(…) 实际上并没有插入到数据库中,尽管日志显示以下内容:

org.jooq.tools.LoggerListener            : Executing query          : insert into `user` (...)
org.jooq.tools.LoggerListener            : -> with bind values      : insert into `user` ...

但是,如果我重载User道的插入方法并用@Transacational-it works注释它,实际上会插入行。我想我配置错误了一些东西。

使用带有jOOQ启动启动器的Spring Boot。

共有1个答案

严昀
2023-03-14

问题实际上在于设置自动提交(false)。

 类似资料:
  • 我试图在我的表中插入一条新记录 DSLContext类型中的方法newRecord(Table, Object)不适用于参数(String, ModelBook) 但是和这个一样:http://www.jooq.org/doc/2.5/manual/sql-execution/fetching/pojos/ 所以我不能做:

  • 数据库是PostgreSQL 10,JOOQ版本是3.10.8。 是我在JOOQ上做错了什么,还是这是一个问题,可能已经在一些新版本中修复了?

  • 我正在尝试将vaadin与spring(没有Spring Boot)和基于java注释的spring部分配置结合起来。 自动连接似乎适用于vaadin ui部分,但不适用于“自定义ui类”(例如,“公共类LoginScreen扩展自定义组件”)。我在SysOut上得到一个NPE或一个空对象。 此外,我注意到“@ComponentScan(base Packages={"net.myapp"})”没

  • 我正在Spring 4应用程序中使用jOOQ 3.8.4和PostgreSQL 9.5。我有下表和类型定义 然后我尝试使用jOOQ插入,即: 然后我得到: 我做错了什么? 更新 我尝试按照Lukas的建议重命名shop.money类型(从到),但我相信问题与模式有关。请参阅更新的错误。 也许类型中的类型是一个问题!

  • 问题内容: 我想表达以下声明: 子选择返回一行,其中包含两列(和),需要将其插入到target中。这样做的原因是,是的主键。是指(外键)。 这可能吗? 问题答案: 我不确定首先使用哪种SQL方言是否可能通过,但是您当然可以使用以下方式表达这种查询: 或与jOOQ

  • 有谁能推荐一种仅当数据库中不存在条目时才通过spring数据jpa(在集群环境中)在数据库表中执行插入的方法吗? 例如,以带有消息和email_address表的数据库为例。当发往“user@so.com”的新消息添加到消息表中时,将在email_address表中检查电子邮件“user@so.com”是否存在于email_address中,如果不存在,则将其添加到数据库中。之后,在消息实体上设置