从零搭建分布式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所需的对象。

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