從零搭建分佈式1:SpringBoot與 JPA 整合

      最近一直在思考,在程序界中怎麼樣才能獲得自己想要的東西,如果一直寫業務,寫業務,寫業務,我覺得有這樣思想的人還是去外包公司比較好,因爲錢多話少技術門檻低,不用太多的去思考整個系統,不用太多的去思考整個技術體系與框架知識,只要寫完業務錢就會到手。這種一舉多得,不假思索的事情我覺得只要不是個“豬”都想去做,因爲人都是有懶惰的心,和恆溫體系的。在這裏我只是以出社會少於三年的碼農爲例子。因爲我也是少於三年的。呆過幾家公司,都是自營公司,做過網站,前端,APP,自己一直覺得小公司給人的幫助很大,但是隻要待到幾個月熟悉了這個公司的技術體系,技術也就可以用來輕鬆、毫不費勁的做爲喫飯的工具。每在一家公司都會覺得讓我失望,做來做去,技術點都是隻停留在業務和基礎框架上面,離我自己想要做的東西遠在西邊。但是呢自己一直在思索是什麼原因,於是自己就在CSDN上一直在搜索三年程序員達到的高度和深度,看了很多勵志的故事,讓我深有感觸,那些牛人無時無刻不在鞭笞自己向前,一個一個大公司的面試,一輪一輪的刷下來,但是也毫不放棄,而是把自己的經驗寫下來,與君共勉。而想想自己的去公司面試,過人而不及。所幸先提升自己。於是買了一本深入實踐SpringBoot從零搭建。在搭建的過程中遇到了很多讓人蛋疼的問題,也學習到了很多寫業務人員所沒觸及到的東西,當然這個基礎不是底層,而是框架層面的,底層的東西還是需要花很多時間理解,與實踐。在整合的過程中,我只列舉自己遇到的錯誤,和不能理解的東西。

整個JPA的時候:

     問題一、

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: At least one JPA metamodel must be present!

 

首先是Bean創建問題。在解決整個問題的過程中,因爲自己能力還沒有達到去調試源碼的能力,於是先百度。百度上面有很多不一樣的答案,百度一般答案都在第一頁,以後查答案就少去第二頁。根據自己的經驗而已不是絕對。看了很多這個問題,大部分人都是在Google上面copy下來的答案。其中很多都是JAR包問題,於是不停的嘗試,始終是不行。還有一些說是註解問題。配置註解問題,嘗試了也還是不行。Spring Boot 書上寫的JPA Config是這樣寫的

public class JpaConfiguration {

@Bean

PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor(){

return new PersistenceExceptionTranslationPostProcessor();

}

}

 後來一直解決不了,因爲自己也沒有搭建springboot的經驗,公司所使用的框架也都是spring Boot 整合mybaiti。然後自己看錯誤的含義。異常是創建bean時異常,BeanCreationException---這個異常放在以前有配置Spring的時候,是需要在配置文件中配置也就是使用SpringBoot <Bean>標籤配置對應的Bean名字即可,所以首先定位是沒有創建這個Bean。後面這個nested exception is java.lang.IllegalArgumentException: At least one JPA metamodel must be present! 異常是非法的參數異常,至少需要一個JPA元模型,這個異常含有

  •  非法數據異常
  •  或者無法通過一個標識或基本擴展轉換將指定值轉換爲基礎數組的指定類型
  •  如果位置描述爲空
  •  如果指定對象參數不是一個數組

大概知道問題出在哪裏。一個是Bean的創建,一個是JPA參數,JPA所需我們的參數也就是數據源,於是回想起有一篇CSDN文章上面定位這個問題,抱着死馬當活馬醫的態度,嘗試一下果然成功。雖然以後很少用到JPA 但是出的問題確實讓自己從中學習到很多。解決方法是:


    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test?characterEncoding=utf8");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
 
        return dataSource;
    }
 
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPackagesToScan("dbdemo.mysql.entity");
        entityManagerFactoryBean.setJpaProperties(buildHibernateProperties());
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter() {{
            setDatabase(Database.MYSQL);
        }});
        return entityManagerFactoryBean;
    }
 
    protected Properties buildHibernateProperties() {
        Properties hibernateProperties = new Properties();
 
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
        hibernateProperties.setProperty("hibernate.show_sql", "true");
        hibernateProperties.setProperty("hibernate.use_sql_comments", "false");
        hibernateProperties.setProperty("hibernate.format_sql", "true");
        hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "update");
        hibernateProperties.setProperty("hibernate.generate_statistics", "false");
        hibernateProperties.setProperty("javax.persistence.validation.mode", "none");
 
        //Audit History flags
        hibernateProperties.setProperty("org.hibernate.envers.store_data_at_delete", "true");
        hibernateProperties.setProperty("org.hibernate.envers.global_with_modified_flag", "true");
 
        return hibernateProperties;
    }
 
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }
 
    @Bean
    public TransactionTemplate transactionTemplate() {
        return new TransactionTemplate(transactionManager());
    }

在JPA配置裏面加上這段代碼,也就註冊幾個JPA所需的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章