为什么 Ebean ORM 抛出 java.sql.SQLException:IJ031021:您无法在托管事务期间回滚

Why is Ebean ORM throwing java.sql.SQLException: IJ031021: You cannot rollback during a managed transaction

我有一个使用 Ebean 查询数据库的 Jax-RS Rest 服务。在我提出的任何查询中都会抛出此异常。

例如

User currentUser = new QUser().where().id.eq(currentUserID)).findUnique();

日志

ERROR [io.ebeaninternal.server.transaction.JdbcTransaction] (default task-10) Error when ending a query only transaction via ROLLBACK: java.sql.SQLException: IJ031021: You cannot rollback during a managed transaction

现在查询 returns 适当的用户并且不会干扰 Jax-RS。

但我无法忽视大代码气味

以及创建的巨大日志,因为它会在每次查询时抛出。

我的配置

ServerConfig config = new ServerConfig();
        config.setDataSource(ds);
        config.setName("db");
        config.setAutoCommitMode(false);
        config.setDatabasePlatform(new PostgresPlatform());
        config.setRegister(true);
        config.setDefaultServer(true);
        config.setTransactionRollbackOnChecked(true);
        config.addPackage(User.class.getPackage().getName());
        EbeanServer es = EbeanServerFactory.create(config);

在 Java EE 中使用 ebean 时,您需要在使用之前配置 EbeanServer。一个典型的地方是在 @Startup @Singleton bean-managed 事务 ejb 的 @PostConstruct 方法中。您需要将其配置为使用 JTA 事务管理器,这样它就不会尝试 begin/commit 自己的事务。

@Singleton
@Startup
@TransactionManagement(TransactionManagementType.BEAN)
public class AtStartup {

    @Resource(mappedName = "java:jboss/datasources/EbeanTestDS")
    private DataSource ds;

    @SneakyThrows
    @PostConstruct
    public void startup() {
        new MigrationRunner(new MigrationConfig()).run(ds); // begin/commits transaction for the migration...

        ServerConfig config = new ServerConfig();
        config.setDataSource(ds);
        config.addPackage(Customer.class.getPackage().getName());
        config.setUseJtaTransactionManager(true); // This is important !
        config.setAutoCommitMode(false);
        EbeanServerFactory.create(config);
    }