簡體   English   中英

Spring 引導 JPA 在 TABLE 中插入帶有大寫名稱的 Hibernate

[英]Spring boot JPA insert in TABLE with uppercase name with Hibernate

我有一個表實體映射為:

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....

當我嘗試在數據庫中插入新記錄時,表名被翻譯為小寫:items_to_register,但我的表名是 ITEMS_TO_REGISTER 如何在不更改 MySql 配置的情況下解決我的問題? (我的.cnf)

我的 application.properties 文件中有:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

在休眠5上,它將是

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

在您的application.properties文件中。

解決方案是添加:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

application.properties

您需要使用tics(`)對表名進行轉義以使其區分大小寫。

@Table(name = "`ITEMS_TO_REGISTER`")

正如@jasonleakey所建議的那樣,我們可以考慮如下使用命名策略。

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

這告訴Hibernate生成與@Table(name =“”)或@Column(name =“”)中指定的SQL完全相同的SQL。 一切安好。

但是請記住-在實體類中使用無@ Table,@ Column批注的PhysicalNamingStrategy時,hibernate使用類名和變量名生成SQL。 考慮下面的java類

Class Employee {
   private String firstName;
   private String lastName; 
}

那么生成的SQL將是,

select employee0_.firstName,employee0_lastName from Employee employee0_;

不幸的是,這不是一個好選擇,因為通常我們會將數據庫中的列定義為FIRST_NAME和LAST_NAME,並將表名稱定義為EMPLOYEE。 如果您未使用PhysicalNamingStrategy,那么SQL將會是

select employee0_.first_name,employee0_last_name from employee employee0_;

因此,實際上是在以下兩個選項之間進行選擇。

  • 使用PhysicalStrategy,並在Java代碼中使用@Table和@Column注釋顯式定義所有表名稱/列名稱。
    要么
  • 在db中定義小寫的表名,然后讓hibernate自動為我們生成表名/列名。

您可以實現自己的策略並從application.properties中調用它:

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy

下面是一個總是大寫首字母的示例

import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
    /**
     * Singleton access
     */
    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    private Identifier capitalize(Identifier name) {
        if (name == null)
            return null;
        if (name.isQuoted())
            return name;
        String text = StringUtils.capitalize(name.getText());
        return Identifier.toIdentifier(text);
    }
}

你可以試試:

@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
   ...

我在示例中使用 H2 數據庫。

使用反引號制作表名“user”將在您的數據庫中為您提供小寫的表名。

實體類:

在此處輸入圖片說明

數據庫中的表名:

在此處輸入圖片說明

PS您可以將實體命名為“用戶”(大寫)它無論如何都會給您“用戶”(小寫)

來源: http : //coddingbuddy.com/article/56566857/jpa-uppercase-table-names

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM