更改Hibernate 5命名策略+ spring boot + annotation

时间:2017-01-29 07:32:15

标签: hibernate spring-boot

我的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中创建的列。连表!

4 个答案:

答案 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.

正如您在此处所见:https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html#common-application-properties

答案 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