From 4e0ecb7ef384954ec594ca103ff401e10ed2f664 Mon Sep 17 00:00:00 2001 From: Francesco Date: Fri, 22 Sep 2023 16:52:41 +0200 Subject: [PATCH] WIP Multiple DataSources working --- .../dbadmin/DbAdminAutoConfiguration.java | 109 +++++++----------- .../controller/DefaultDbAdminController.java | 16 +-- src/main/java/tech/repo/ActionRepository.java | 1 - 3 files changed, 45 insertions(+), 81 deletions(-) diff --git a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java index a84d5ef..26aa3e5 100644 --- a/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java +++ b/src/main/java/tech/ailef/dbadmin/DbAdminAutoConfiguration.java @@ -1,101 +1,72 @@ package tech.ailef.dbadmin; -import java.net.URL; -import java.util.List; import java.util.Properties; import javax.sql.DataSource; import org.hibernate.jpa.HibernatePersistenceProvider; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import jakarta.persistence.EntityManager; +import tech.repo.Action; @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ComponentScan @EnableConfigurationProperties(DbAdminProperties.class) -//@AutoConfiguration +@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "internalEntityManagerFactory", transactionManagerRef = "internalTransactionManager", basePackages = { "tech.repo" } ) +@EnableTransactionManagement public class DbAdminAutoConfiguration { - @Autowired - Environment env; - - @Bean + @Autowired + Environment env; + + @Bean public DataSource internalDataSource() { - DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); - dataSourceBuilder.driverClassName("org.h2.Driver"); - dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); - dataSourceBuilder.username("sa"); - dataSourceBuilder.password("password"); - return dataSourceBuilder.build(); + DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + dataSourceBuilder.driverClassName("org.h2.Driver"); + dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); + dataSourceBuilder.username("sa"); + dataSourceBuilder.password("password"); + return dataSourceBuilder.build(); } - - @Bean - public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() { - LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); - factoryBean.setDataSource(internalDataSource()); - factoryBean.setPersistenceUnitName("internal"); - factoryBean.setPersistenceProvider(new HibernatePersistenceProvider()); -// factoryBean.setManagedTypes(new PersistenceManagedTypes() { -// -// @Override -// public URL getPersistenceUnitRootUrl() { -// return null; -// } -// -// @Override -// public List getManagedPackages() { -// return List.of("tech.ailef.dbadmin.model", "tech.ailef.dbadmin.repository"); -// } -// -// @Override -// public List getManagedClassNames() { -// return List.of("tech.ailef.dbadmin.model.Action"); -// } -// }); - factoryBean.setPackagesToScan("tech.repo"); //, "tech.ailef.dbadmin.repository"); -// List ts = new ArrayList<>(); -// factoryBean.setManagedTypes(ts); - factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); - Properties properties = new Properties(); - properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); - properties.setProperty("hibernate.hbm2ddl.auto", "update"); - factoryBean.setJpaProperties(properties); - factoryBean.afterPropertiesSet(); - return factoryBean; - } - -// @Bean -// public EntityManager getInternalEntityManager() { -//// if (internalEntityManager == null) { -// LocalContainerEntityManagerFactoryBean emf = internalEntityManager(); -// EntityManagerFactory factory = emf.getNativeEntityManagerFactory(); -// return factory.createEntityManager(); -//// } -//// return internalEntityManager; -// } - - @Bean - public PlatformTransactionManager internalTransactionManager() { - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(internalEntityManagerFactory().getObject()); - return transactionManager; - } - - + + @Bean + public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() { + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + factoryBean.setDataSource(internalDataSource()); + factoryBean.setPersistenceUnitName("internal"); + factoryBean.setPackagesToScan("tech.repo"); // , "tech.ailef.dbadmin.repository"); + factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + Properties properties = new Properties(); + properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.setProperty("hibernate.hbm2ddl.auto", "update"); + factoryBean.setJpaProperties(properties); + factoryBean.afterPropertiesSet(); + return factoryBean; + } + + @Bean + public PlatformTransactionManager internalTransactionManager() { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(internalEntityManagerFactory().getObject()); + return transactionManager; + } + } \ No newline at end of file diff --git a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java index 9c21fb8..16c8d2b 100644 --- a/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java +++ b/src/main/java/tech/ailef/dbadmin/controller/DefaultDbAdminController.java @@ -13,6 +13,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.http.HttpStatus; import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -25,9 +26,9 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.PersistenceContext; import jakarta.persistence.PersistenceUnit; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -59,18 +60,9 @@ public class DefaultDbAdminController { @Autowired private DbAdmin dbAdmin; - @PersistenceUnit(unitName = "internal") - private EntityManagerFactory entityManagerFactory; - -// private EntityManager entityManager; @Autowired private ActionRepository repo; -// @PostConstruct -// public void initialize() { -// this.entityManager = entityManagerFactory.createEntityManager(); -// } - /** * Home page with list of schemas * @param model @@ -78,11 +70,13 @@ public class DefaultDbAdminController { * @return */ @GetMapping -// @Transactional("internalTransactionManager") + @Transactional("internalTransactionManager") public String index(Model model, @RequestParam(required = false) String query) { Action a = new Action(); a.setDescription("ciao"); // a.setId(1); +// entityManagerFactory.createEntityManager().persist(a); +// entityManager.persist(a); Action save = repo.save(a); System.out.println(save); diff --git a/src/main/java/tech/repo/ActionRepository.java b/src/main/java/tech/repo/ActionRepository.java index 52fea0e..287ba81 100644 --- a/src/main/java/tech/repo/ActionRepository.java +++ b/src/main/java/tech/repo/ActionRepository.java @@ -8,7 +8,6 @@ import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; @Repository -//@Component public interface ActionRepository extends JpaRepository { }