Spring Data JPA 默认和自定义命名约定

1. 引言

Spring Data JPA提供了许多在应用程序中使用JPA的功能。在这些功能中,DDL 和 DML 查询中表名和列名的标准化。

在这个简短的教程中,我们将了解如何配置此默认命名约定。

2. 默认命名约定

首先,让我们看看Spring关于表名和列名的默认命名约定。

让我们想象一下,我们有一个Person 实体:

@Entity
public class Person {
    @Id
    private Long id;
    private String firstName;
    private String lastName;
}

我们这里有一些名称必须映射到数据库。好吧,Spring默认使用小蛇写,这意味着它只使用小写字母并用下划线分隔单词。因此,Person 实体的表创建查询将是:

create table person (id bigint not null, first_name varchar(255), last_name varchar(255), primary key (id));

返回所有名字的选择查询将是:

select first_name from person;

为此,Spring实施了其版本的冬眠物理命名策略弹簧物理命名策略

3. RDMS区分大小写

在详细介绍如何创建自定义命名约定之前,让我们先来谈谈 RDMS 如何管理标识符的大小写。

有两种情况需要考虑:RDMS 区分大小写,或者不区分大小写。

在第一种情况下,RDMS 将严格匹配具有相同大小写的标识符。因此,在我们的示例中,以下查询将起作用:

select first_name from person;

虽然这个会抛出一个错误,甚至不会返回结果:

select FIRST_NAME from PERSON;

另一方面,对于不区分大小写的 RDMS,两个查询都可以正常工作。

我们该怎么做才能强制 RDMS 也匹配有关其情况的标识符?我们可以使用带引号的标识符(例如,“person”)。

通过在标识符两边使用引号,我们告诉数据库,在将这些标识符与表名和列名进行比较时,它也应该与情况相匹配。因此,仍然使用我们的示例,以下查询将起作用:

select "first_name" from "person";

虽然这个不会:

select "first_name" from "PERSON";

从理论上讲,这是因为每个RDMS都以自己的方式管理引用的标识符,因此里程各不相同

4. 自定义命名约定

现在,让我们实现我们自己的命名约定。

想象一下,我们不能使用Spring下蛇情况策略,但我们需要使用上部蛇情况。然后,我们需要提供物理命名策略的实现

由于我们将保持蛇形大小写,最快的选择是从SpringPhysical命名策略继承并将标识符转换为大写:

public class UpperCaseNamingStrategy extends SpringPhysicalNamingStrategy {
    @Override
    protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
        return new Identifier(name.toUpperCase(), quoted);
    }
}

我们只是重写了 getIdentifier() 方法,该方法负责在超类中将标识符转换为小写。在这里,我们用它来将它们转换为大写。

一旦我们编写了我们的实现,我们必须注册它,以便Hibernate知道使用它。使用弹簧,这是通过在我们的应用程序属性中设置弹簧.jpa.休眠.命名.物理策略属性来完成

spring.jpa.hibernate.naming.physical-strategy=com.baeldung.namingstrategy.UpperCaseNamingStrategy

现在,我们的查询使用大写标识符:

create table PERSON (ID bigint not null, FIRST_NAME varchar(255), LAST_NAME varchar(255), primary key (ID));

select FIRST_NAME from PERSON;

假设我们要使用带引号的标识符,以便 RDMS 被迫匹配大小写。然后,我们必须使用 true 作为标识符() 构造函数的引号参数

@Override
protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
    return new Identifier(name.toUpperCase(), true);
}

在我们的查询之后,将显示带引号的标识符:

create table "PERSON" ("ID" bigint not null, "FIRST_NAME" varchar(255), "LAST_NAME" varchar(255), primary key ("ID"));

select "FIRST_NAME" from "PERSON";

5. 结论

在这篇简短的文章中,我们讨论了使用Spring数据JPA实现自定义命名策略的可能性,以及RDMS将如何处理有关其内部配置的DDL和DML语句。

像往常一样,本文的完整代码可以在GitHub上找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值