This commit is contained in:
Francesco 2023-09-22 12:57:09 +02:00
parent 88f411af4e
commit 64d85b00d5
4 changed files with 86 additions and 58 deletions

View File

@ -1,5 +1,7 @@
package tech.ailef.dbadmin; package tech.ailef.dbadmin;
import java.net.URL;
import java.util.List;
import java.util.Properties; import java.util.Properties;
import javax.sql.DataSource; import javax.sql.DataSource;
@ -10,20 +12,31 @@ import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.env.Environment; 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.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
@ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true) @ConditionalOnProperty(name = "dbadmin.enabled", matchIfMissing = true)
@ComponentScan @ComponentScan
@EnableConfigurationProperties(DbAdminProperties.class) @EnableConfigurationProperties(DbAdminProperties.class)
@AutoConfiguration //@AutoConfiguration
@EnableJpaRepositories(
entityManagerFactoryRef = "internalEntityManagerFactory",
transactionManagerRef = "internalTransactionManager",
basePackages = { "tech.repo" }
)
public class DbAdminAutoConfiguration { public class DbAdminAutoConfiguration {
@Autowired @Autowired
Environment env; Environment env;
private static DataSource internalDataSource() { @Bean
public DataSource internalDataSource() {
DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create(); DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver"); dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal"); dataSourceBuilder.url("jdbc:h2:file:./dbadmin_internal");
@ -32,19 +45,57 @@ public class DbAdminAutoConfiguration {
return dataSourceBuilder.build(); return dataSourceBuilder.build();
} }
public static LocalContainerEntityManagerFactoryBean internalEntityManager() { @Bean
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory() {
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(internalDataSource()); factoryBean.setDataSource(internalDataSource());
factoryBean.setPersistenceUnitName("internal"); factoryBean.setPersistenceUnitName("internal");
factoryBean.setPersistenceProvider(new HibernatePersistenceProvider()); factoryBean.setPersistenceProvider(new HibernatePersistenceProvider());
factoryBean.setPackagesToScan("tech.ailef.dbadmin.model"); // factoryBean.setManagedTypes(new PersistenceManagedTypes() {
//
// @Override
// public URL getPersistenceUnitRootUrl() {
// return null;
// }
//
// @Override
// public List<String> getManagedPackages() {
// return List.of("tech.ailef.dbadmin.model", "tech.ailef.dbadmin.repository");
// }
//
// @Override
// public List<String> getManagedClassNames() {
// return List.of("tech.ailef.dbadmin.model.Action");
// }
// });
factoryBean.setPackagesToScan("tech.repo"); //, "tech.ailef.dbadmin.repository");
// List<ManagedType> ts = new ArrayList<>();
// factoryBean.setManagedTypes(ts);
factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
Properties properties = new Properties(); Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); properties.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
properties.setProperty("hibernate.hbm2ddl.auto", "update"); properties.setProperty("hibernate.hbm2ddl.auto", "update");
factoryBean.setJpaProperties(properties); factoryBean.setJpaProperties(properties);
factoryBean.afterPropertiesSet(); factoryBean.afterPropertiesSet();
return factoryBean; 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;
}
} }

View File

@ -1,28 +1,17 @@
package tech.ailef.dbadmin.controller; package tech.ailef.dbadmin.controller;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.Oracle12cDialect;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.jdbc.UncategorizedSQLException; import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
@ -35,19 +24,14 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import static org.hibernate.cfg.AvailableSettings.*;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory; import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.SharedCacheMode; import jakarta.persistence.PersistenceUnit;
import jakarta.persistence.ValidationMode;
import jakarta.persistence.spi.ClassTransformer;
import jakarta.persistence.spi.PersistenceUnitInfo;
import jakarta.persistence.spi.PersistenceUnitTransactionType;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import tech.ailef.dbadmin.DbAdmin; import tech.ailef.dbadmin.DbAdmin;
import tech.ailef.dbadmin.DbAdminAutoConfiguration;
import tech.ailef.dbadmin.DbAdminProperties; import tech.ailef.dbadmin.DbAdminProperties;
import tech.ailef.dbadmin.dbmapping.DbAdminRepository; import tech.ailef.dbadmin.dbmapping.DbAdminRepository;
import tech.ailef.dbadmin.dbmapping.DbObject; import tech.ailef.dbadmin.dbmapping.DbObject;
@ -57,6 +41,8 @@ import tech.ailef.dbadmin.dto.PaginatedResult;
import tech.ailef.dbadmin.dto.QueryFilter; import tech.ailef.dbadmin.dto.QueryFilter;
import tech.ailef.dbadmin.exceptions.InvalidPageException; import tech.ailef.dbadmin.exceptions.InvalidPageException;
import tech.ailef.dbadmin.misc.Utils; import tech.ailef.dbadmin.misc.Utils;
import tech.repo.Action;
import tech.repo.ActionRepository;
/** /**
* The main DbAdmin controller that register most of the routes of the web interface. * The main DbAdmin controller that register most of the routes of the web interface.
@ -73,31 +59,17 @@ public class DefaultDbAdminController {
@Autowired @Autowired
private DbAdmin dbAdmin; private DbAdmin dbAdmin;
private EntityManager entityManager; @PersistenceUnit(unitName = "internal")
private EntityManagerFactory entityManagerFactory;
@PostConstruct // private EntityManager entityManager;
public void initialize() { @Autowired
// params.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); private ActionRepository repo;
// params.put("spring.jpa.database-platform", "org.hibernate.dialect.H2Dialect");
LocalContainerEntityManagerFactoryBean emf = DbAdminAutoConfiguration.internalEntityManager();
EntityManagerFactory factory = emf.getNativeEntityManagerFactory();
entityManager = factory.createEntityManager();
// EntityManagerFactory emf = new HibernatePersistenceProvider().createEntityManagerFactory("internal", params); // @PostConstruct
// public void initialize() {
// entityManager = entityManagerFactory.createEntityManager(); // this.entityManager = entityManagerFactory.createEntityManager();
// entityManager = emf.createEntityManager(); // }
}
// @Autowired
// private ApplicationContext applicationContext;
// public void displayAllBeans() {
// String[] allBeanNames = applicationContext.getBeanDefinitionNames();
// for(String beanName : allBeanNames) {
// System.out.println(beanName);
// }
// }
/** /**
* Home page with list of schemas * Home page with list of schemas
@ -108,10 +80,12 @@ public class DefaultDbAdminController {
@GetMapping @GetMapping
// @Transactional("internalTransactionManager") // @Transactional("internalTransactionManager")
public String index(Model model, @RequestParam(required = false) String query) { public String index(Model model, @RequestParam(required = false) String query) {
// Action a = new Action(); Action a = new Action();
// a.setDescription("ciao"); a.setDescription("ciao");
// a.setId(1); // a.setId(1);
// new ActionRepository(entityManger).save(a); Action save = repo.save(a);
System.out.println(save);
// repo.save(a); // repo.save(a);
// displayAllBeans(); // displayAllBeans();

View File

@ -1,4 +1,4 @@
package tech.ailef.dbadmin.model; package tech.repo;
import jakarta.persistence.Entity; import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue; import jakarta.persistence.GeneratedValue;
@ -29,4 +29,9 @@ public class Action {
this.description = description; this.description = description;
} }
@Override
public String toString() {
return "Action [id=" + id + ", description=" + description + "]";
}
} }

View File

@ -1,16 +1,14 @@
package tech.ailef.dbadmin.repository; package tech.repo;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import jakarta.persistence.EntityManager; import jakarta.persistence.EntityManager;
import tech.ailef.dbadmin.model.Action;
public class ActionRepository extends SimpleJpaRepository<Action, Integer> { @Repository
//@Component
public ActionRepository(EntityManager em) { public interface ActionRepository extends JpaRepository<Action, Integer> {
super(Action.class, em);
}
} }