当前位置: 首页 > 知识库问答 >
问题:

带下划线的JPA列-CustomPhysicalNamingStrategy正在抛出NullPointer exeption

尉迟德惠
2023-03-14

经过一些研究,参考这些帖子,我尝试设置自定义命名策略

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

customProperties()

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)
final String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();

使用spring Boot-2.2.4.发布

共有1个答案

仲孙逸明
2023-03-14

问题出在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();
    } 
}

请找到下面的链接:

自定义物理命名策略

 类似资料:
  • 问题内容: 我使用JPA进行数据库访问,并用正确的名称注释了每一列。现在,如果我执行查询(例如),它将返回 错误消息是正确的,未知,因为真实名称是。 型号:程序 标签 询问 JPA是否有理由将“ programId”更改为“ program_id”,或者我缺少任何配置? 谢谢 编辑:抱歉,忘记添加查询代码/信息。 我使用Spring Data的界面并尝试了查询。 问题答案: 如spring-boo

  • 模型:程序 标签 查询

  • 问题内容: 我正在尝试使JLabel带有下划线。我到处搜寻,但一无所获。即使在属性中,也没有为JLabel下划线的选项。我能做什么? 问题答案: 要么

  • 问题内容: 如何在CSS3中从左到右创建 下划线动画? 问题答案: 这是一个非常棘手的问题。 唯一的解决办法我能想出是过渡的或我其实应该说我过渡,并让出现,并在同一时间保持,在这种情况下,链接对齐。 很难解释,所以我举了一个简短的例子,它并不完美,看起来有些混乱,但至少可以说明我的意思。:-) HTML 的CSS

  • 我在一个spring webmvc项目上使用spring-data-jpa。我在使用我的一个实体的存储库创建查询时遇到了一个问题。下面您可以看到我的实体、我的存储库和异常。 我的实体: 我的存储库: 而例外, 最后,我将重命名为(删除下划线),并重命名getters/setters和存储库(),问题得到解决。 我的问题是为什么会发生这种情况?

  • 问题内容: 我看了一些有关主干js的视频。这是直接来自视频的示例。是从2012年开始的,所以我认为主干规则/库已经更改,但是我不知道为什么这暂时不起作用。在视频中,该人演示了它在JS小提琴中运行的过程,但我无法使其正常工作。(我在JS Fiddle中包括了必要的库,即下划线,主干和jQuery) 问题答案: 您曾经能够一口气解析并填写Underscore模板,如下所示: 但是从Underscore