【问题标题】:Spring Data JPA inserting underline character between variable wordsSpring Data JPA在变量词之间插入下划线字符
【发布时间】:2022-02-08 17:31:22
【问题描述】:

Spring Data JPA 在变量中的单词之间插入下划线字符,如果第二个术语不是单词,则不会发生这种情况:

@Entity
@Table(name = "table")
public class Entity{
@Id
@GeneratedValue
private Long id;
private String variableA;
private String variableYes;
}

对于“variableA”,它创建带有 variableA SQL 文本插入的表,对于“variableYes”,它在 SQL variable_Yes 中插入,我没有找到有关此特殊性的文档。 Eclipse IDE 控制台:

create table questao (id bigint not null, variableA char(255), variable_Yes varchar(255), primary key (id));

【问题讨论】:

    标签: java hibernate spring-data-jpa


    【解决方案1】:

    默认使用 CamelCase。当遇到一个大写字母(不是小写的最后一个和下一个字母)的时候被认为是一个新词的开始。您可以尝试variableAAvariableAa,它们会生成variableaavariable_aa。使用@Column(name = "variable_a") 明确指定名称是一种很好的做法。

    【讨论】:

      【解决方案2】:

      hibernate 允许你定义策略。看: https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#PhysicalNamingStrategy

      您可以定义此 PhysicalNamingStrategy 的自定义实现。如果你不这样做,我猜它使用 SpringPhysicalNamingStrategy 作为默认策略。

      SpringPhysicalNamingStrategy中,通过属性名生成列名,方法如下:

      private boolean isUnderscoreRequired(char before, char current, char after) {
              return Character.isLowerCase(before) && Character.isUpperCase(current) && Character.isLowerCase(after);
          }
      

      所以,variableA 不是匹配规则,而是 variableYes 匹配。而且你的数据库是区分大小写的,所以 variableYes 转换为 variable_Yes,但 variableA 没有任何变化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多