代码之家  ›  专栏  ›  技术社区  ›  Nawnit Sen

Spring数据JPA不使用自动配置的EntityManagerFactory

  •  1
  • Nawnit Sen  · 技术社区  · 6 年前

    我正在应用程序中使用SpringBoot和SpringDataJPA。当我使用自动配置时 entityManagerFactoryBean 由JPA提供,我将得到下面的错误以及正在生成的查询。

      select
            simentity0_.simid as simid1_3_,
            simentity0_.service_number as service_number2_3_,
            simentity0_.sim_number as sim_number3_3_,
            simentity0_.sim_status as sim_status4_3_ 
        from
            sim simentity0_ 
        where
            simentity0_.sim_number=? 
            and simentity0_.service_number=?
    2018-11-16 14:26:40.824  WARN 10784 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 904, SQLState: 42000
    2018-11-16 14:26:40.824 ERROR 10784 --- [nio-8080-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-00904: "SIMENTITY0_"."SERVICE_NUMBER": invalid identifier
    

    但当我提供 显式配置 对于 实体管理器FactoryBean 使用下面的Java配置。

    @Bean
    public LocalContainerEntityManagerFactoryBean getEntityManager() {
            LocalContainerEntityManagerFactoryBean bean = new 
    
        LocalContainerEntityManagerFactoryBean();
                bean.setPackagesToScan("com.mypackage.entity");
                bean.setDataSource(getDataSource());
                bean.setJpaVendorAdapter(getJpaVendor());
                return bean;
            }
    

    下面是工作时生成的查询。

     select simentity0_.simID as simID1_3_,
        simentity0_.serviceNumber as serviceN2_3_, 
        simentity0_.simNumber as simNumbe3_3_, 
        simentity0_.simStatus as simStatu4_3_ 
       from SIM 
        simentity0_ 
       where 
        simentity0_.simNumber=? 
        and simentity0_.serviceNumber=?
    

    这是实体bean和应用程序属性文件。

    应用程序属性

    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
    spring.jpa.show-sql=true
    spring.datasource.username=nawnit.sen
    spring.datasource.password=pass
    

    Java语言

    @Entity
    @Table(name = "SIM")
    public class SimEntity {
        @Id
        private Integer simID;
        private Long serviceNumber;
        private Long simNumber;
        private String simStatus;
    

    SQL查询

    create table SIM (
        simID integer primary key,
        serviceNumber integer not null,
        simNumber integer not null,
        simStatus varchar2(10) not null
    );
    

    _ 列名 在第一个查询中。我不明白它为什么会出现在查询中。可能是因为我没有提供 packageToScan 属性文件中的属性,在第一种情况下(自动配置bean)。

    1 回复  |  直到 6 年前
        1
  •  2
  •   StasKolodyuk    6 年前

    原因是 Spring Boot 自动配置使用 SpringPhysicalNamingStrategy 但是违约 Hibernate 一个是 PhysicalNamingStrategyStandardImpl

    可以通过属性指定要使用的命名策略,例如 spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 财产