休眠命名策略更改表名

2022-09-04 01:43:11

我对休眠(版本5.1)命名策略有点困惑 - 也就是说,它改变了我的表名,我想避免这种情况。另外 - 根据inteliji,似乎已被弃用,但我找不到正确配置它的(其他)方法。spring.jpa.hibernate.naming_strategy

我在应用程序属性中有以下配置:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=thread

如前所述,第一个被标记为已被删除。

现在我有一个实体:

@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}

表名是,就像在usaUploadTable中一样。@Table(name = "")

现在,当我运行我的应用程序时,我得到

表“usertable201.usa_upload_table”不存在

这是正确的 - 它不像冬眠如何改变它那样命名。

如何使休眠正确使用我的表名?

编辑:

我也试过

DefaultNamingStrategy
ImprovedNamingStrategy

他们都改变了它

版本:

spring-boot-1.4.0.RELEASE
hibernate 5.1
javax-transaction-api 1.2
hibernate-validator 5.2.4
javassist 3.20

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

它对我有用。以下是我正在使用的版本:

Spring Boot (v1.4.2.RELEASE)
Hibernate Core {5.0.11.Final}

答案 2

问题出在spring-boot-1.4中 - 似乎他们已经改变了属性(或其他什么),我现在发现这个答案改进的NamingStrategy不再在Hibernate 5中工作,但它仍然没有正确解决。所以我稍微修改了一下代码,不使用下划线方法,并扩展新引入的类:SpringPhysicalNamingStrategy

package com.foo;

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

import java.io.Serializable;
import java.util.Locale;


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

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl();

    @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());
    }

}

在我已将已弃用的行更改为application.properties

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

现在,它完全使用表和列名称,就像我在实体文件中一样。


推荐