gpt4 book ai didi

java - 调用 createEntityManagerFactory 时为 "You cannot set autocommit during a managed transaction"

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:52:24 24 4
gpt4 key购买 nike

我正在尝试通过在我的应用程序中分离模式来实现 Multi-Tenancy 。为此,我有一个 Tenant 实体,其中包含一个 String schemaName,并且我有一个 Singleton Startup EJB在启动时创建 EntityManagerFactory 的映射;一个工厂分配给每个 Tenant

这是我的 EJB:

@Startup
@Singleton
public class TenantManagementServiceImpl implements TenantManagementService {

private Map<Tenant, EntityManagerFactory> entityManagerFactoryMap;

@PersistenceContext
private EntityManager entityManager;

@PostConstruct
private void init()
{
buildEntityManagerFactories();
}

private List<Tenant> getAllTenants() {
return entityManager.createNamedQuery("Tenant.getAll", Tenant.class).getResultList();
}

private void buildEntityManagerFactories() {
entityManagerFactoryMap = new HashMap<>();

for (Tenant tenant : getAllTenants()) {
Map<String, String> properties = new HashMap<>();
properties.put("hibernate.default_schema", tenant.getSchemaName());
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("MyApp", properties);
entityManagerFactoryMap.putIfAbsent(tenant, entityManagerFactory);
}
}

@Override
public EntityManagerFactory getEntityManagerFactory(Tenant tenant) {
return entityManagerFactoryMap.get(tenant);
}

}

以及正在使用的NamedQuery:

@NamedQuery(name = "Tenant.getAll", query = "SELECT t FROM Tenant t")

不幸的是,在启动时,我收到此错误:

java.lang.Exception: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"myapp-1.0-SNAPSHOT.war\".component.TenantManagementServiceImpl.START" => "org.jboss.msc.service.StartException in service jboss.deployment.unit.\"myapp-1.0-SNAPSHOT.war\".component.TenantManagementServiceImpl.START: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
Caused by: java.lang.IllegalStateException: WFLYEE0042: Failed to construct component instance
Caused by: javax.ejb.EJBException: javax.persistence.PersistenceException: [PersistenceUnit: MyApp] Unable to build Hibernate SessionFactory
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: MyApp] Unable to build Hibernate SessionFactory
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Unable to open JDBC connection for schema management target
Caused by: java.sql.SQLException: IJ031017: You cannot set autocommit during a managed transaction"}}

错误发生在这一行:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("MyApp", properties);

我正在使用 this guide作为引用。我不明白为什么会收到此错误。我正在使用 WildFly 10。出了什么问题,我该如何纠正?

最佳答案

EJB 的默认事务行为是容器管理的,这意味着事务生命周期由应用程序服务器的 ejb 容器管理。您需要通过注释您的 ejb 类将其设置为 bean 管理的:

@Startup
@Singleton
@TransactionManagement(value=TransactionManagementType.BEAN)
public class TenantManagementServiceImpl implements TenantManagementService {


}

关于java - 调用 createEntityManagerFactory 时为 "You cannot set autocommit during a managed transaction",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38420972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com