情景描述
- 使用flywayMigrate create table
- table(已经生成的Table)采用驼峰方法命名(growthNote)
- Entity中已经在类前加上了@Table(name="growthNote")
- 调用Repsitory的find方法,报错。由于在数据库中找不到
growth_note
table。
矛盾点
- 明明已经使用注解@Table确定了table的名字,那么Repository为什么还是会到growth_note中find?
问题
- Q1:
@Table
为什么没有用? - A1:查询资料之后得出结论,我们使用的Hibernate已经是5.1版本,也就意味着,Hibernate要求你设置
hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
属性,将你设置在@Table或者@Column的名称用于物理数据库,否则你将无法让你设置的命名用于数据库。
- Q2:为什么命名会从驼峰法变成下划线的方式?
- A2:查看herbinate官网得知
An improved naming strategy that prefers embedded underscores to mixed case names
,因此herbinate的默认命名策略是将驼峰变成下划线区分的方式。
- Q3:官网推荐我们修改命名策略,设置
spring.jpa.hibernate.naming-strategy=EJB3NamingStrategy
为什么依旧没有作用? - 由于Hibernate5.1废弃了这个配置,将这个配置替换成了两个配置
hibernate.physical_naming_strategy hibernate.implicit_naming_strategy
。
- Q4:那么这两个配置的作用分别是什么呢?
- A4:https://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/chapters/domain/naming.html#PhysicalNamingStrategy,
明确讲解作用。
解决方案
- 使用@Table(name="growthNote")
- 然后配置属性
spring.jpa.herbinate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
将逻辑名称运用于物理数据表。
反思:
- 花费很多时间去查属性以及他的值用法,一直被误解找不到最佳答案,直到最后才去官网查。
Action:
- 遇到问题先定位出错的位置,对应哪个工具,直接去工具的官网查找解答。