如何使用 camelCase 将 Hibernate 实体字段映射到 snake_case(下划线)数据库标识符

新手上路,请多包涵

我有下划线的数据库字段。我在驼峰式中有实体字段。我无法改变其中任何一个。

有什么东西,也许是我可以用来将实体列名注释默认为驼峰式等价物的类级别注释吗?

例如,我有一个这样的实体:

 @Entity
public class AuthorisationEntity {

    @Column(name = "non_recoverable")
    private BigDecimal nonRecoverable;

    @Column(name = "supplier_recoverable")
    private BigDecimal supplierRecoverable;

    @Column(name = "refund_amount")
    private BigDecimal refundAmount;

}

我梦想这样:

 @Entity
@DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault
public class AuthorisationEntity {

    private BigDecimal nonRecoverable;

    private BigDecimal supplierRecoverable;

    private BigDecimal refundAmount;

}

原文由 Paul Stanley 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 418
2 个回答

您可以使用自定义的 Hibernate 命名策略来实现这一点。

您需要做的就是使用 hibernate-types 开源项目。

休眠 5.2 或更高版本

您需要添加以下 Maven 依赖项:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

并设置以下 Hibernate 配置属性:

 <property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

休眠 5.0 和 5.1

您需要添加以下 Maven 依赖项:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-5</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

并设置以下 Hibernate 配置属性:

 <property name="hibernate.physical_naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

休眠 4.3

您需要添加以下 Maven 依赖项:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-43</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

并设置以下 Hibernate 配置属性:

 <property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

休眠 4.2 和 4.1

您需要添加以下 Maven 依赖项:

 <dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-4</artifactId>
    <version>${hibernate-types.version}</version>
</dependency>

并设置以下 Hibernate 配置属性:

 <property name="hibernate.ejb.naming_strategy"
          value="com.vladmihalcea.hibernate.type.util.CamelCaseToSnakeCaseNamingStrategy"
/>

测试时间

假设您有以下实体:

 @Entity(name = "BookAuthor")
public class BookAuthor {

    @Id
    private Long id;

    private String firstName;

    private String lastName;

    //Getters and setters omitted for brevity
}

@Entity(name = "PaperBackBook")
public class PaperBackBook {

    @Id
    @GeneratedValue(
        strategy = GenerationType.SEQUENCE
    )
    private Long id;

    @NaturalId
    private String ISBN;

    private String title;

    private LocalDate publishedOn;

    @ManyToOne(fetch = FetchType.LAZY)
    private BookAuthor publishedBy;

    //Getters and setters omitted for brevity
}

当使用 CamelCaseToSnakeCaseNamingStrategy 自定义命名策略时,Hibernate 将使用 hbm2ddl 工具生成以下数据库模式:

 CREATE SEQUENCE hibernate_sequence
START WITH 1 INCREMENT BY 1

CREATE TABLE book_author (
    id          BIGINT NOT NULL,
    first_name  VARCHAR(255),
    last_name   VARCHAR(255),
    PRIMARY KEY (id)
)

CREATE TABLE paper_back_book (
    id              BIGINT NOT NULL,
    isbn            VARCHAR(255),
    published_on    DATE,
    title           VARCHAR(255),
    published_by_id BIGINT,
    PRIMARY KEY (id)
)

很酷,对吧?

原文由 Vlad Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题