概括:
Micronaut/JPA/Hibernate 正在小寫我的資料庫表的名稱,并在啟動時拋出一個錯誤,說找不到該表。該表在那里,但它以大寫命名。如何配置 micronaut/jpa/hibernate 以尊重我的表名的大小寫而不是小寫?
細節:
我在 MySQL8 資料庫中有一個現有表WIDGET,我需要使用 jpa/hibernate 從 micronaut 服務訪問它。不幸的是,在啟動模式驗證期間拋出了一個錯誤,它正在尋找表widget而不是WIDGET.
我已經在不同的環境(spring、postgres)中尋找并找到了類似問題的解決方案,但一直無法讓它們在 micronaut 中作業。我嘗試對我的物體名稱 ( & ) 使用反引號和轉義引號,但沒有成功。我嘗試向application.yml 添加一個元素,但沒有成功(不確定在哪里/如何指定它)。@Entity(name="`WIDGET`")@Entity(name="\"WIDGET\"")delimited-identifiers
以下是相關位:
應用程式.yml:
datasources:
default:
url: 'jdbc:mysql://localhost:3306/myschema'
username: '${dbUser}'
password: '${dbPass}'
jpa:
default:
properties:
hibernate:
hbm2ddl:
auto: validate
小部件.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
uj5u.com熱心網友回復:
一個搜索能力比我強的同事發現了這個。雖然我不需要用我自己的@Replace DefaultPhysicalNamingStrategy.class,但我可以通過如下更改我的 application.yml 來解決我的問題,特別是physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'在 jpa.default.properties.hibernate 節點下添加:
jpa:
default:
properties:
hibernate:
physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'
hbm2ddl:
auto: validate
show_sql: true
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490065.html
