Hibernate naming strategy changing table names

前端 未结 5 1929
别那么骄傲
别那么骄傲 2020-12-05 12:01

I\'m a little bit confused by hibernates (version 5.1) naming strategy - namely it changes my table name and I\'d like to avoid that. Also - spring.jpa.hibernate.namin

相关标签:
5条回答
  • 2020-12-05 12:12

    The problem lies in spring-boot-1.4 - it seems like they have changed the properties (or whatever) I've now found this answer ImprovedNamingStrategy no longer working in Hibernate 5, but it still didn't resolve correctly. So I have changed the code a little to not use the underscore method and to extend the newly introduced class 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());
        }
    
    }
    

    And in application.properties I've changed the deprecated line to

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

    Now it uses exactly the table and column names as I have them in my entity files.

    0 讨论(0)
  • 2020-12-05 12:13

    Spring boot 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;
    }
    

    }

    0 讨论(0)
  • 2020-12-05 12:20

    For one who wants to upper case in Postgresql and 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);
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 12:21

    If you are providing @Table and @Column annotation in your entity classes with names provided with an underscore i.e. user_id i.e. @Column(name="user_id"), it will take the column name as user_id; if you give it as userid then it will change to user_id if you use no strategy or implicit strategy (specifically spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl). So, if you want a strategy where the entity attribute name changes to one with underscore and lowercase letters i.e. something from userId to user_id, you should use implicit or no strategy (which actually uses implicit strategy).

    If you don't want your naming strategy to add an underscore to the column name or class name, then the strategy that you need to use would look like: spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl. The things that you provide in annotations @Table and @Column’s name attribute would remain as it is.

    If you don't want to provide annotations and want to manually handle the table name and column names, you should extend the class org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl and override the required methods. If you still use annotations for some of the cases here, remember the overridden methods will apply on the names written in those annotations. spring.jpa.hibernate.naming.physical-strategy=example.CustomStrategy

    0 讨论(0)
  • 2020-12-05 12:23
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    

    it worked for me. here are the versions i'm using:

    Spring Boot (v1.4.2.RELEASE)
    Hibernate Core {5.0.11.Final}
    
    0 讨论(0)
提交回复
热议问题