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

时间:2017-04-26 18:09:55

标签: jdbc jax-rs ebean

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

例如。

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

日志

  

错误[io.ebeaninternal.server.transaction.JdbcTransaction](默认任务-10)通过ROLLBACK结束仅查询事务时出错:java.sql.SQLException:IJ031021:在托管事务期间无法回滚

现在查询返回适当的用户并且不会干扰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);

1 个答案:

答案 0 :(得分:1)

在Java EE中使用ebean时,需要在使用EbeanServer之前对其进行配置。一个典型的实现方法是在@Startup @Singleton bean管理的事务ejb的@PostConstruct方法中。而且您需要对其进行配置以使用JTA事务管理器,以便它不会尝试自行开始/提交事务。

@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);
    }