"当调用createEntityManagerFactory时,您无法在托管事务期间设置自动提交"

Mit*_*dge 6 java jpa

我试图通过在我的应用程序中分离模式来实现多租户.在这样做的过程中,我有一个Tenant包含a 的实体String schemaName,并且我有一个Singleton StartupEJB,可以EntityManagerFactory在启动时创建一个s 的映射; 每个工厂分配一个工厂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);
    }

}
Run Code Online (Sandbox Code Playgroud)

NamedQuery正在使用:

@NamedQuery(name = "Tenant.getAll", query = "SELECT t FROM Tenant t")
Run Code Online (Sandbox Code Playgroud)

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

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"}}
Run Code Online (Sandbox Code Playgroud)

错误发生在这一行:

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("MyApp", properties);
Run Code Online (Sandbox Code Playgroud)

我使用本指南作为参考.我不明白为什么我收到这个错误.我正在使用WildFly 10.出了什么问题,我怎么能纠正它?

Aja*_*wal 13

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

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


}
Run Code Online (Sandbox Code Playgroud)