Стратегия именования Hibernate изменение имен таблиц

Я немного смущен стратегией именования hibernates (версия 5.1), а именно, она изменяет имя моей таблицы, и я хотел бы избежать этого. Также - spring.jpa.hibernate.naming_strategy кажется устаревшим в соответствии с intelij, но я не могу найти (nother) способ его правильной настройки.

у меня есть следующие настройки в приложении.свойства:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=thread

первый помечен как depracted, как сказал.

теперь у меня есть сущности:

@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}

таблица зовут, как в @Table(name = "") usaUploadTable.

теперь, когда я запускаю свое приложение, я получаю

стол '.usa_upload_table ' не существует

что правильно - он не назван так, как hibernate меняет его.

что я могу сделать, чтобы hibernate правильно использовал мое имя таблицы?

Edit:

Я также пробовал

DefaultNamingStrategy
ImprovedNamingStrategy

все они меняются это

варианты:

spring-boot-1.4.0.RELEASE
hibernate 5.1
javax-transaction-api 1.2
hibernate-validator 5.2.4
javassist 3.20

4 ответов


spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

это сработало для меня. вот версии, которые я использую:

Spring Boot (v1.4.2.RELEASE)
Hibernate Core {5.0.11.Final}

проблема заключается в spring-boot-1.4-похоже, они изменили свойства (или что-то еще), теперь я нашел этот ответ ImprovedNamingStrategy больше не работает в спящем режиме 5, но это все равно не правильно. Поэтому я немного изменил код, чтобы не использовать метод подчеркивания и расширить недавно введенный класс SpringPhysicalNamingStrategy:

package com.foo;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import java.io.Serializable;
import java.util.Locale;


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

}

и application.properties Я изменил устаревшую строку на

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

теперь он использует именно имена таблиц и столбцов, как они есть в моих файлах сущностей.


для тех, кто хочет верхний регистр в Postgresql и Spring boot 1.5.2

public class CustomDatabaseIdentifierNamingStrategy extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final long serialVersionUID = 1L;
    public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }

}

Весенняя загрузка 2.0.0 & Hibernate 5

    public class MySqlNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
    return false;
}

}