当前位置: 首页 > 知识库问答 >
问题:

为什么Spring Data/Hibernate在表为“productdef”时查询表“product_def”?

姚韬
2023-03-14

我使用的是Spring Boot 2.3.4/Spring Data/Hibernate/MySQL8。

我的数据库表称为“ProductDef”。我有一个实体对象“ProductDef”。

当我执行“全部列表”查询时,我得到了这个错误...

java.sql.SQLSyntaxErrorException: Table 'mydatabase.product_def' doesn't exist

我尝试将注释@table(name=“productdef”)添加到实体中,但没有帮助。

如果我将db表重命名为“PRODUCT_DEF”,我的代码就可以工作了。但不幸的是,我不能为我的项目重命名db表名。

我错过了什么?

更新:

解决方案是实现一个自定义的PhysicalNamingStrategy,以防止“ProductDef”变成“Product_Def”。

并像这样实现类:

package com.myapp.dao;

import java.io.Serializable;

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable {

    public static final PhysicalNamingStrategy INSTANCE = new PhysicalNamingStrategyStandardImpl();

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }

}

共有1个答案

夏侯涵映
2023-03-14

这是Hibernate使用并由JPA2.0定义的默认命名策略,特别是PhysicalNamingStrategy:它将表名和列名的camel大小写转换为下划线。

参见:https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/domain/naming.html#physicalnamingstrategy

虽然implicitnamingstrategy的目的是确定名为accountnumber的属性在未显式指定时映射到accountnumber的逻辑列名,但physicalnamingstrategy的目的是表示物理列名应该缩写为acct_num

有多种方法可以指定要使用的PhysicalNamingStrategy。首先,应用程序可以使用hibernate.physical_naming_strategy配置设置指定实现。

使用Spring,还可以使用以下属性配置该策略:Spring.jpa.hibernate.naming.physical-strategy

默认情况下,Spring Boot使用SpringPhysicalNamingStrategy配置物理命名策略。这个实现提供了与Hibernate4相同的表结构:所有点都被下划线替换,驼峰大小写也被下划线替换。默认情况下,所有表名都以小写形式生成,但如果架构需要,可以重写该标志。

 类似资料:
  • 问题内容: 演示: 为什么要打电话?似乎没有将结果用于任何显而易见的事情。一个循环不会做。在迭代器协议的任何地方都没有提到这点,只是讨论和。 这是Python预先为列表保留空间还是类似的东西? (Linux上的CPython 3.6.0) 问题答案: 请参阅PEP 424 的“基本原理”部分,该部分介绍并提供了有关动机的见解: 能够根据预期大小(由估算)预先分配列表可能是一项重大优化。 观察到CP

  • 问题内容: 我有这个hibernate代码: 它可以编译并正常工作。 但是在IntelliJ中,我收到此错误报告: 无法解析表达式,无法解析符号“ MyTable” 为什么IntelliJ抱怨呢? 问题答案: IntelliJ试图在字符串本身内部验证您的HQL查询。为此,需要将其配置为了解您的hibernate配置,以确保存在MyTable的映射(如您所知,它在运行时会执行,因为它执行!)。 在您

  • 问题内容: 为什么hibernate对这些类使用联接表? 我既不需要联接表也不需要双向关联:( 问题答案: 因为这是它的设计方式,也是JPA规范要求它映射这样的关联的方式。如果要在广告投放表中添加联接列,请使用 这是有据可查的。

  • 问题内容: 我一直在尝试hibernate,Spring和Servlet。现在,我被卡住了。为什么会出现此异常?我认为将hbm2ddl.auto设置为create时会自动创建表。 appicationContext.xml UserDetails.java Main.java 例外 问题答案: 属性名称应以hibernate作为前缀。 顺便说一句,有一种更简单的方法来配置属性,如下所示

  • 我正在使用JPA Criteria API构建查询。当我使用

  • 问题内容: 众所周知,在 Hibernate 5中* 不建议使用 条件查询 。在以前的Hibernate版本中,该功能非常有用。 而且它的性能仍然优于HQL。 * __ 那么它在 Hibernate 5中 被弃用的原因是什么? 这是从这里。 Hibernate提供了一个较旧的旧式API,应将其视为已弃用。没有针对这些API的功能开发。最终,特定于Hibernate的条件功能将被移植为JPA的扩展