Spring boot - configure EntityManager

前端 未结 2 1897
[愿得一人]
[愿得一人] 2020-11-29 00:37

I was using Google guice in my project and now I tried to convert the framework to SpringBoot totally.

I configured the Bean for pers

2条回答
  •  Happy的楠姐
    2020-11-29 01:15

    Hmmm you can find lot of examples for configuring spring framework. Anyways here is a sample

    @Configuration
    @Import({PersistenceConfig.class})
    @ComponentScan(basePackageClasses = { 
        ServiceMarker.class,
        RepositoryMarker.class }
    )
    public class AppConfig {
    
    }
    

    PersistenceConfig

    @Configuration
    @PropertySource(value = { "classpath:database/jdbc.properties" })
    @EnableTransactionManagement
    public class PersistenceConfig {
    
        private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
        private static final String PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH = "hibernate.max_fetch_depth";
        private static final String PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE = "hibernate.jdbc.fetch_size";
        private static final String PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE = "hibernate.jdbc.batch_size";
        private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
        private static final String[] ENTITYMANAGER_PACKAGES_TO_SCAN = {"a.b.c.entities", "a.b.c.converters"};
    
        @Autowired
        private Environment env;
    
         @Bean(destroyMethod = "close")
         public DataSource dataSource() {
             BasicDataSource dataSource = new BasicDataSource();
             dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
             dataSource.setUrl(env.getProperty("jdbc.url"));
             dataSource.setUsername(env.getProperty("jdbc.username"));
             dataSource.setPassword(env.getProperty("jdbc.password"));
             return dataSource;
         }
    
         @Bean
         public JpaTransactionManager jpaTransactionManager() {
             JpaTransactionManager transactionManager = new JpaTransactionManager();
             transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());
             return transactionManager;
         }
    
        private HibernateJpaVendorAdapter vendorAdaptor() {
             HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
             vendorAdapter.setShowSql(true);
             return vendorAdapter;
        }
    
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {
    
             LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
             entityManagerFactoryBean.setJpaVendorAdapter(vendorAdaptor());
             entityManagerFactoryBean.setDataSource(dataSource());
             entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
             entityManagerFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);             
             entityManagerFactoryBean.setJpaProperties(jpaHibernateProperties());
    
             return entityManagerFactoryBean;
         }
    
         private Properties jpaHibernateProperties() {
    
             Properties properties = new Properties();
    
             properties.put(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH, env.getProperty(PROPERTY_NAME_HIBERNATE_MAX_FETCH_DEPTH));
             properties.put(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_FETCH_SIZE));
             properties.put(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE, env.getProperty(PROPERTY_NAME_HIBERNATE_JDBC_BATCH_SIZE));
             properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
    
             properties.put(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none");
             properties.put(AvailableSettings.USE_CLASS_ENHANCER, "false");      
             return properties;       
         }
    
    }
    

    Main

    public static void main(String[] args) { 
        try (GenericApplicationContext springContext = new AnnotationConfigApplicationContext(AppConfig.class)) {
            MyService myService = springContext.getBean(MyServiceImpl.class);
            try {
                myService.handleProcess(fromDate, toDate);
            } catch (Exception e) {
                logger.error("Exception occurs", e);
                myService.handleException(fromDate, toDate, e);
            }
        } catch (Exception e) {
            logger.error("Exception occurs in loading Spring context: ", e);
        }
    }
    

    MyService

    @Service
    public class MyServiceImpl implements MyService {
    
        @Inject
        private MyDao myDao;
    
        @Override
        public void handleProcess(String fromDate, String toDate) {
            List myList = myDao.select(fromDate, toDate);
        }
    }
    

    MyDaoImpl

    @Repository
    @Transactional
    public class MyDaoImpl implements MyDao {
    
        @PersistenceContext
        private EntityManager entityManager;
    
        public Student select(String fromDate, String toDate){
    
            TypedQuery query = entityManager.createNamedQuery("Student.findByKey", Student.class);
            query.setParameter("fromDate", fromDate);
            query.setParameter("toDate", toDate);
            List list = query.getResultList();
            return CollectionUtils.isEmpty(list) ? null : list;
        }
    
    }
    

    Assuming maven project: Properties file should be in src/main/resources/database folder

    jdbc.properties file

    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=your db url
    jdbc.username=your Username
    jdbc.password=Your password
    
    hibernate.max_fetch_depth = 3
    hibernate.jdbc.fetch_size = 50
    hibernate.jdbc.batch_size = 10
    hibernate.show_sql = true
    

    ServiceMarker and RepositoryMarker are just empty interfaces in your service or repository impl package.

    Let's say you have package name a.b.c.service.impl. MyServiceImpl is in this package and so is ServiceMarker.

    public interface ServiceMarker {
    
    }
    

    Same for repository marker. Let's say you have a.b.c.repository.impl or a.b.c.dao.impl package name. Then MyDaoImpl is in this this package and also Repositorymarker

    public interface RepositoryMarker {
    
    }
    

    a.b.c.entities.Student

    //dummy class and dummy query
    @Entity
    @NamedQueries({
    @NamedQuery(name="Student.findByKey", query="select s from Student s where s.fromDate=:fromDate" and s.toDate = :toDate)
    })
    public class Student implements Serializable {
    
        private LocalDateTime fromDate;
        private LocalDateTime toDate;
    
        //getters setters
    
    }
    

    a.b.c.converters

    @Converter(autoApply = true)
    public class LocalDateTimeConverter implements AttributeConverter {
    
        @Override
        public Timestamp convertToDatabaseColumn(LocalDateTime dateTime) {
    
            if (dateTime == null) {
                return null;
            }
            return Timestamp.valueOf(dateTime);
        }
    
        @Override
        public LocalDateTime convertToEntityAttribute(Timestamp timestamp) {
    
            if (timestamp == null) {
                return null;
            }    
            return timestamp.toLocalDateTime();
        }
    }
    

    pom.xml

    
        1.8
        4.2.1.RELEASE
        5.0.2.Final
        2.1.1
        5.1.36
         4.12 
    
    
    
        
            junit
            junit
            ${junit.version}
            test
        
    
        
        
            org.springframework
            spring-context
            ${org.springframework.version}
        
    
        
            org.springframework
            spring-jdbc
            ${org.springframework.version}
        
    
        
            javax.inject
            javax.inject
            1
            compile
        
    
        
            org.springframework
            spring-tx
            ${org.springframework-version}
        
    
        
            org.springframework
            spring-orm
            ${org.springframework-version}
        
    
        
            org.hibernate
            hibernate-entitymanager
            ${hibernate-entitymanager.version}
        
    
        
            mysql
            mysql-connector-java
            ${mysql-connector-java.version}
        
    
        
            org.apache.commons
            commons-dbcp2
            ${commons-dbcp2.version}
        
    
    
    
         ${project.artifactId}
         
             
                org.apache.maven.plugins
                maven-compiler-plugin
                3.3
                
                    ${java-version}
                    ${java-version}
                    -Xlint:all
                    true
                    true
                
            
         
    
    

    Hope it helps. Thanks

提交回复
热议问题