Spring 数据 jpa 不能与自动配置的 entityManagerFactory 一起工作
Spring data jpa not working with auto configured entityManagerFactory
我在我的应用程序中使用 spring 引导和 spring 数据 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
提供 显式配置 时 configuration.It 工作正常。
@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
模拟实体.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
);
看到第一个列名中的_
query.i不明白为什么要查询。可能是因为我在第一种情况下没有在属性文件中提供 packageToScan
属性(采用 autoConfiguredBean 的地方)。
原因是 Spring Boot
自动配置使用 SpringPhysicalNamingStrategy but the default Hibernate
one is PhysicalNamingStrategyStandardImpl
您可以通过 属性 指定要使用的命名策略,例如spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
属性
我在我的应用程序中使用 spring 引导和 spring 数据 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
提供 显式配置 时 configuration.It 工作正常。
@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
模拟实体.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
);
看到第一个列名中的_
query.i不明白为什么要查询。可能是因为我在第一种情况下没有在属性文件中提供 packageToScan
属性(采用 autoConfiguredBean 的地方)。
原因是 Spring Boot
自动配置使用 SpringPhysicalNamingStrategy but the default Hibernate
one is PhysicalNamingStrategyStandardImpl
您可以通过 属性 指定要使用的命名策略,例如spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
属性