Spring data jpa 不适用于自动配置的 entityManagerFactory

Posted

技术标签:

【中文标题】Spring data jpa 不适用于自动配置的 entityManagerFactory【英文标题】:Spring data jpa not working with auto configured entityManagerFactory 【发布时间】:2019-04-19 18:35:59 【问题描述】:

我在我的应用程序中使用 spring boot 和 spring data jpa。当我使用 jpa 提供的自动配置 entityManagerFactoryBean 时,我遇到错误以及正在生成的查询。

  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

但是当我使用下面的 java 配置为entityManagerFactoryBean 提供显式配置时,它工作正常。

@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 和应用程序属性文件。

Application.properties

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

SimEntity .java

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

query.sql

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

请参阅第一个查询中列名中的_。我不明白为什么它会出现在查询中。可能是因为我没有在第一种情况下在属性文件中提供packageToScan 属性(使用 autoConfiguredBean)。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

@NawnitSen,您使用的是哪些 Spring Boot 和 Hibernate 版本? spring-boot-starter-parent 2.1.0.RELEASE 和其余部分来自管理依赖版本 @NawnitSen,尝试设置spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl,如果有帮助我会更新答案 hibernate-core-5.3.7 并启动 -2.1.0。顺便说一句“spring.properties.hibernate.namingStrategy=org.hibernate.cfg.DefaultNamingStrategy”这是我添加的。 @NawnitSen,看我上面的评论

以上是关于Spring data jpa 不适用于自动配置的 entityManagerFactory的主要内容,如果未能解决你的问题,请参考以下文章

存储库注释不适用于 Spring 数据 JPA

Spring Boot 自动配置无法与 spring-data-jpa 一起正常工作

没有 Spring Boot 的 Spring Data JPA

具有自动配置的 Spring Data JPA 应用程序的多个数据库

Postgres Interval 不适用于本机 Spring 数据 JPA 查询

Spring JPA 更新不适用于嵌套对象