摘要:
Micronaut/JPA/Hibernate正在降低我的数据库表的名称,并在启动时抛出一个错误,说找不到表。桌子在那儿,但用大写字母命名。如何配置micronaut/jpa/hibernate来尊重我的表名的大小写&而不是小写呢?
详细信息:
我在MySQL8数据库中有一个现有的表MySQL8,我需要使用jpa/hibernate从micronaut服务访问该表。总之,在启动模式验证时会抛出一个错误,它正在寻找表widget
而不是WIDGET
。
我在不同的环境(spring,postgres)中查找并找到了solutions for similar issues,但一直无法让它们在micronaut中工作。我尝试过对我的实体名(@Entity(name="`WIDGET`")
& @Entity(name="\"WIDGET\"")
)使用backticks和转义引号,但没有成功。我尝试将delimited-identifiers
元素添加到application.yml中,但没有成功(不确定在哪里/如何指定它)。
以下是相关的双边投资条约:
application.yml:
datasources:
default:
url: 'jdbc:mysql://localhost:3306/myschema'
username: '${dbUser}'
password: '${dbPass}'
jpa:
default:
properties:
hibernate:
hbm2ddl:
auto: validate
Widget.java:
@Entity(name = "WIDGET")
//@Table(name = "`WIDGET`") // this doesn't work either
public class Widget {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "year")
private Integer year;
@Column(name = "widget_title")
private String title;
// appropriate constructors, getters, & setters omitted for brevity...
}
WidgetRepository.java
@Repository
public interface WidgetRepository extends CrudRepository<Widget, Integer>
{
@Executable
Optional<Widget> find(String title);
}
例外:
14:40:33.759 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [org.hibernate.SessionFactory] could not be loaded: Error instantiating bean of type [org.hibernate.SessionFactory]
Message: Schema-validation: missing table [widget]
Path Taken: SessionFactory.hibernateSessionFactory(SessionFactoryBuilder sessionFactoryBuilder)
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [org.hibernate.SessionFactory] could not be loaded: Error instantiating bean of type [org.hibernate.SessionFactory]
Message: Schema-validation: missing table [widget]
Path Taken: SessionFactory.hibernateSessionFactory(SessionFactoryBuilder sessionFactoryBuilder)
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1898)
at io.micronaut.context.DefaultApplicationContext.initializeContext(DefaultApplicationContext.java:245)
at io.micronaut.context.DefaultBeanContext.readAllBeanDefinitionClasses(DefaultBeanContext.java:3298)
at io.micronaut.context.DefaultBeanContext.finalizeConfiguration(DefaultBeanContext.java:3650)
at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:337)
at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:190)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:72)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:320)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:306)
at com.example.Application.main(Application.java:11)
Caused by: io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.hibernate.SessionFactory]
Message: Schema-validation: missing table [widget]
Path Taken: SessionFactory.hibernateSessionFactory(SessionFactoryBuilder sessionFactoryBuilder)
at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2344)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2282)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2228)
at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:2988)
at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2890)
at io.micronaut.context.DefaultBeanContext.loadContextScopeBean(DefaultBeanContext.java:2709)
at io.micronaut.context.DefaultBeanContext.initializeContext(DefaultBeanContext.java:1892)
... 9 common frames omitted
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [widget]
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:129)
at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:97)
at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:76)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:204)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:85)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
at io.micronaut.configuration.hibernate.jpa.EntityManagerFactoryBean.hibernateSessionFactory(EntityManagerFactoryBean.java:222)
at io.micronaut.configuration.hibernate.jpa.$EntityManagerFactoryBean$HibernateSessionFactory3$Definition.build(Unknown Source)
at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:161)
at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2331)
... 16 common frames omitted
发布于 2022-06-02 22:49:10
一位比我搜索更好的同事找到了this。虽然我不需要@将DefaultPhysicalNamingStrategy.class替换为自己的application.yml,但我能够通过更改application.yml(特别是在jpa.default.properties.hibernate节点下添加physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'
)来解决问题:
jpa:
default:
properties:
hibernate:
physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'
hbm2ddl:
auto: validate
show_sql: true
https://stackoverflow.com/questions/72482441
复制相似问题