簡體   English   中英

JPA 列帶下划線 - CustomPhysicalNamingStrategy 正在拋出 NullPointer 異常

[英]JPA column with underscore - CustomPhysicalNamingStrategy is throwing NullPointer exeption

經過一些研究,參考這些帖子,我嘗試設置自定義命名策略

Hibernate 命名策略

JPA 列下划線不正確

這是我的自定義命名策略

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy {

    @Override
    public Identifier toPhysicalCatalogName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalColumnName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSchemaName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalSequenceName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    @Override
    public Identifier toPhysicalTableName(final Identifier identifier, final JdbcEnvironment jdbcEnv) {
        return convertToSnakeCase(identifier);
    }

    private Identifier convertToSnakeCase(final Identifier identifier) {
        final String regex = "([a-z])([A-Z])";
        final String replacement = "$1_$2";
        final String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();
        return Identifier.toIdentifier(newName);
    }

LocalContainerEntityManagerFactoryBean:

@Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(dataSource());
        localContainerEntityManagerFactoryBean.setPackagesToScan(basePackage);
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        localContainerEntityManagerFactoryBean.setJpaProperties(customProperties());
        return localContainerEntityManagerFactoryBean;
    }

自定義屬性()

Properties customProperties() {
        Properties properties = new Properties();
        properties.setProperty("hibernate.dialect",
                ResourceConfig.getProperties().getProperty(PropertyConstants.SPRING_JPA_HIBERNATE_DIALECT));
        properties.setProperty("hibernate.hbm2ddl.auto", ddl);
        properties.setProperty("hibernate.show_sql", showSQL);
        properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", metaDataDefaults);
        properties.setProperty("hibernate.jdbc.lob.non_contextual_creation", contextualCreation);
        properties.setProperty("hibernate.physical_naming_strategy", "com.config.CustomPhysicalNamingStrategy");
        return properties;
    }

但是當啟動 springboot 應用程序時,它會拋出以下異常:

Caused by: java.lang.NullPointerException
    at com.config.CustomPhysicalNamingStrategy.convertToSnakeCase(CustomPhysicalNamingStrategy.java:47)

精確到 CustomPhysicalNamingStrategy 中的行

final String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();

我錯過了一些配置,還是我做錯了?

使用 spring 啟動 - 2.2.4.RELEASE

問題出在 CustomPhysicalNamingStrategy 上:

它應該是:

public class CustomPhysicalNamingStrategy extends PhysicalNamingStrategyStandardImpl {

    private static final long serialVersionUID = 1L;

    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy ();

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

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

    protected static String addUnderscores(String name) {
        final StringBuilder buf = new StringBuilder(name);
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1)) &&
                    Character.isUpperCase(buf.charAt(i)) &&
                    Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase();
    } 
}

請找到以下鏈接:

自定義物理命名策略

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM