spring-data-jpa Sping Boot JPA在TABLE中的插入,带有Hibernate的大写名称

z9zf31ra  于 2022-11-10  发布在  Spring
关注(0)|答案(8)|浏览(164)

我有一个表实体Map为:

@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配置的情况下修复我的问题?(my.cnf)
我的www.example.com文件中有application.properties:

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

hfyxw5xn1#

在休眠5中,它将是

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

应用程序.属性文件中。

hgqdbh6s

hgqdbh6s2#

正如@jasonleakey所建议的,我们可以考虑使用以下命名策略。

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

这会告诉Hibernate生成与@Table(name=”“)或@Column(name=”“)中指定的完全相同的SQL。
但是请记住--当在实体类中使用没有@Table,@Column注解的PhysicalNamingStrategy时,Hibernate会使用类名和变量名生成SQL。

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

则所生成的SQL将是,

select employee0_.firstName,employee0_lastName from Employee employee0_;

不幸的是,这不是一个好的选择,因为通常我们会将数据库中的列定义为FIRST_NAME和LAST_NAME,并将表名定义为EMPLOYEE。

select employee0_.first_name,employee0_last_name from employee employee0_;

所以这实际上是在下面两个选项之间的选择。

  • 使用PhysicalStrategy并使用@Table和@Column标注在java代码中显式定义所有表名/列名。

  • 在db中定义小写的表名,让hib自动为我们生成表名/列名。
2eafrhcq

2eafrhcq3#

您需要用tic(`)转义表名,使其区分大小写。

@Table(name = "`ITEMS_TO_REGISTER`")
vxbzzdmp

vxbzzdmp4#

解决方法是添加:

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

application.properties

rkue9o1l

rkue9o1l5#

您可以实施自己的策略,并从www.example.com调用它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);
    }
}
rekjcdws

rekjcdws6#

我在示例中使用了H2数据库。
使表名“user”带有反勾号将在数据库中为您提供小写的表名。
实体类别:

数据库中的表名:

P.S.您可以将实体命名为“User”(大写),但无论如何,它都会将您命名为“user”(小写)
来源:http://coddingbuddy.com/article/56566857/jpa-uppercase-table-names

pqwbnv8z

pqwbnv8z7#

您可以尝试:

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

wsewodh28#

请尝试此属性:

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true

相关问题