4
私のアプリケーションでスキーマを分離してマルチテナントを実装しようとしています。これを行うにあたり、私はString schemaName
を含むTenant
エンティティを持っています。起動時にEntityManagerFactory
のマップを作成するSingleton
Startup
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を使用しています。何がうまくいかず、どうすれば修正できますか?
のように、ejbクラスにアノテーションを付けてBean管理として設定する必要があります。本当にありがとう!! –