为什么 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);
}
我有一个使用 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);
}