【问题标题】:How to map Hibernate entity fields using camelCase to snake_case (underscore) database identifiers如何使用camelCase将Hibernate实体字段映射到snake_case(下划线)数据库标识符
【发布时间】:2014-10-30 03:24:36
【问题描述】:

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

有什么东西,也许是一个类级别的注释,我可以使用默认的实体列名注释到驼峰式等效项?

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

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

}

【问题讨论】:

  • 我找不到课程@DatabaseIsUnderscoreAndThisAnnotationConvertsThemToCamelCaseByDefault ... 开个玩笑,但我真的很想把这个贴给我的朋友。 :)

标签: java hibernate annotations


【解决方案1】:

您可以使用自定义 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)
)

很酷,对吧?

【讨论】:

  • 给这位先生两杯威士忌!这终于修复了 hibernate 5 的蛇案例命名策略!
  • 这不起作用。你知道它可能是什么吗? javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not extract ResultSet。我正在使用implementation("com.vladmihalcea", "hibernate-types-52","2.10.0"),并将属性放在hibernate.cfg
  • 你可以在 GitHub 上找到大量的测试用例来证明它是有效的。将我的测试与您的测试进行比较,看看它们有何不同
  • hibernate-types 太棒了!我将它用于 Postgres 扩展支持。
  • 很高兴你喜欢它。
【解决方案2】:

你可以使用hibernate的命名策略。此类命名策略类描述了如何为给定的 java 名称生成数据库名称。

见:

naming strategy example

second example

very good oracle naming strategy - 它将骆驼转换为下划线约定,等等

【讨论】:

  • 这看起来可以满足我的需求,不错
【解决方案3】:

我在 Spring 启动应用程序中遇到了同样的问题,我尝试将上述 Hibernate 配置添加到 spring 属性文件中但没有成功,将其添加为 java bean,再次没有成功。

我正在使用 Hibernate Properties 对象,在其中添加休眠配置解决了我的问题:

    protected Properties buildHibernateProperties() {
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        hibernateProperties.setProperty("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());

        return hibernateProperties;
    }

【讨论】:

    【解决方案4】:
    import org.hibernate.cfg.DefaultNamingStrategy;
    import org.hibernate.cfg.ImprovedNamingStrategy;
    
    public class NamingStratagyTest {
        public static void main(String[] args) {
            String colName = DefaultNamingStrategy.INSTANCE.columnName("UserName");
            System.out.println(colName); // UserName
            colName = ImprovedNamingStrategy.INSTANCE.columnName("UserName");
            System.out.println(colName);// user_name
        }
    }
    

    你去吧,选择适合你需要的命名策略。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2012-07-01
      • 2018-01-16
      • 2010-10-14
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多