2016-07-17 22 views
4

私のアプリケーションでスキーマを分離してマルチテナントを実装しようとしています。これを行うにあたり、私はString schemaNameを含むTenantエンティティを持っています。起動時にEntityManagerFactoryのマップを作成するSingletonStartup EJBを持っています。 1つの工場がそれぞれ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を使用しています。何がうまくいかず、どうすれば修正できますか?

答えて

7

EJBのデフォルトのトランザクション動作はコンテナ管理されています。つまり、トランザクションライフサイクルはアプリケーションサーバーのejbコンテナによって管理されます。

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


} 
+0

のように、ejbクラスにアノテーションを付けてBean管理として設定する必要があります。本当にありがとう!! –

関連する問題