我的spring启动项目在实体类中使用了JPA
hibernate注释。我有自己的通用存储库,我NOT
从JPA的entityManagerFactory获取Hibernate SessionFactory。创建新表和列时会发生此问题。 Camel列在数据库上使用下划线创建。
我将命名策略更改为org.hibernate.cfg.EJB3NamingStrategy
中的application.yml
,但没有修复。
application.yml:
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
show-sql: true
hibernate:
ddl-auto: update
naming-strategy: org.hibernate.cfg.EJB3NamingStrategy
在我自己的Generic存储库中获取hibernate会话(不使用EntityManager):
@Autowired
public SessionFactory sessionFactory;
public Session getSession() {
try {
return sessionFactory.getCurrentSession();
} catch (HibernateException e) {
System.out.println(e.getMessage().toString());
}
return sessionFactory.openSession();
}
我曾经创建了一个自定义的namingStrategy扩展ImplicitNamingStrategyJpaCompliantImpl
,但什么都没发生!
有什么问题?
What I want:
在数据库中的camel中创建的列。连表!
答案 0 :(得分:3)
使用Hibernate 5,您应该使用不同的属性:
spring.jpa.hibernate.naming.implicit-strategy= # Hibernate 5 implicit naming strategy fully qualified name.
spring.jpa.hibernate.naming.physical-strategy= # Hibernate 5 physical naming strategy fully qualified name.
答案 1 :(得分:1)
如果您在实体类中提供@Table
和@Column
批注,且其名称带有下划线,即 user_id ,即@Column(name="**user_id**")
,则该列名称为 user_id ;如果您将其指定为用户ID,则如果您不使用任何策略或隐式策略(特别是spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
),它将更改为user_id。因此,如果您想要一个策略,其中实体属性名称更改为带下划线和小写字母的策略,即从 userId 到 user_id 的某一项,则应使用隐式或不使用策略(实际上使用隐式策略)。
如果您不希望您的命名策略在列名或类名上添加下划线,那么您需要使用的策略应类似于:
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
。您在注释@Table
和@Column
的 name 属性中提供的内容将保持原样。
如果您不想提供注释,并且想要手动处理表名和列名,则应该扩展类org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
并覆盖所需的方法。如果您在某些情况下仍使用注释,请记住,重写的方法将应用于那些注释中编写的名称。
spring.jpa.hibernate.naming.physical-strategy=example.CustomStrategy
答案 2 :(得分:1)
我正在使用Spring Data JPA 2.2.1,下面的配置对我有用
spring.jpa.properties.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
答案 3 :(得分:0)
我的项目使用带有 Hibernate ORM 核心版本 5.4.28.Final 的 @Embedded 注释,以下对我有用。
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyComponentPathImpl
在 Hibernate 用户指南中找到了正确的设置 https://docs.jboss.org/hibernate/stable/orm/userguide/html_single/Hibernate_User_Guide.html#embeddable-multiple-namingstrategy