Spring boot JPA insert in TABLE with uppercase name with Hibernate

后端 未结 6 959
别那么骄傲
别那么骄傲 2020-12-01 07:08

i have a table entity mapped as :

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = \"ID_ITEM_TO_REGISTER\")
@GeneratedValue         


        
相关标签:
6条回答
  • 2020-12-01 07:44

    As @jasonleakey suggested we can consider using naming-strategy as below.

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

    this tells Hibernate to generate SQL's as exactly as specified in the @Table (name=" ") or @Column(name=" "). All well.

    But keep in mind - while using PhysicalNamingStrategy without @Table, @Column annotations in the entity class, hibernate generates SQL using class name and variable names. Consider the below java class

    Class Employee {
       private String firstName;
       private String lastName; 
    }
    

    then the generated sql would be,

    select employee0_.firstName,employee0_lastName from Employee employee0_;
    

    Unfortunately this is not a great choice as typically we would have defined the columns in DB as FIRST_NAME and LAST_NAME and table name as EMPLOYEE. Had you not used PhysicalNamingStrategy the SQL would have been

    select employee0_.first_name,employee0_last_name from employee employee0_;
    

    so it's really a choice between the below two options.

    • Use PhysicalStrategy and explicitly define all tables names/column names in java code with @Table and @Column annotations.
      or
    • Define lowercase table name in db and let hibernate automatically generate table names/column names for us.
    0 讨论(0)
  • 2020-12-01 07:45

    On hibernate 5, it would be

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

    in your application.properties file.

    0 讨论(0)
  • 2020-12-01 07:50

    You can try:

    @Entity
    @Table(name = "ITEMS_TO_REGISTER")
    public class ItemsToRegister implements Serializable {
       ...
    
    0 讨论(0)
  • 2020-12-01 07:55

    You can implement your own strategy and invoke it from application.properties:

    spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy
    

    Bellow an example that always capitalize the first letter

    import java.io.Serializable;
    import org.apache.commons.lang3.StringUtils;
    import org.hibernate.boot.model.naming.Identifier;
    import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
    import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
    
    public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
        /**
         * Singleton access
         */
        public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();
    
        @Override
        public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
            return capitalize(name);
        }
    
        @Override
        public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
            return capitalize(name);
        }
    
        @Override
        public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
            return capitalize(name);
        }
    
        @Override
        public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
            return capitalize(name);
        }
    
        @Override
        public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
            return capitalize(name);
        }
    
        private Identifier capitalize(Identifier name) {
            if (name == null)
                return null;
            if (name.isQuoted())
                return name;
            String text = StringUtils.capitalize(name.getText());
            return Identifier.toIdentifier(text);
        }
    }
    
    0 讨论(0)
  • 2020-12-01 07:58

    The solution is to add:

    spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
    

    to application.properties

    0 讨论(0)
  • 2020-12-01 07:58

    You'll need to escape the table name with tics(`) to make it case sensitive.

    @Table(name = "`ITEMS_TO_REGISTER`")
    
    0 讨论(0)
提交回复
热议问题