Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate命名策略更改表名_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

Java Hibernate命名策略更改表名

Java Hibernate命名策略更改表名,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我对hibernates(5.1版)的命名策略有点困惑——也就是说,它改变了我的表名,我希望避免这种情况。另外-spring.jpa.hibernate.naming_策略在intelij看来似乎不受欢迎,但我找不到(其他)正确配置它的方法 我在application.properties中有以下配置: spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy spring.jpa.properties.h

我对hibernates(5.1版)的命名策略有点困惑——也就是说,它改变了我的表名,我希望避免这种情况。另外-
spring.jpa.hibernate.naming_策略
在intelij看来似乎不受欢迎,但我找不到(其他)正确配置它的方法

我在application.properties中有以下配置:

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
如前所述,第一个标记为departracted

现在我有了一个实体:

@Entity
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "")
public class UsaUploadTable {
    ....
}
表名是,如
@table(name=“”)
usahuploadtable中所示

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

表“usertable201.usa\u upload\u Table”不存在

这是正确的-它的命名与hibernate改变它的方式不同

如何使hibernate正确使用我的表名

编辑:

我也试过了

DefaultNamingStrategy
ImprovedNamingStrategy
他们都改变了

版本:

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

问题出在spring-boot-1.4中——看起来他们已经更改了属性(或其他),我现在找到了这个答案,但仍然没有正确解决。因此,我对代码做了一些修改,不使用下划线方法,并扩展了新引入的类
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
spring.jpa.properties.hibernate.physical\u naming\u strategy=.RealNamingStrategyImpl
现在它使用的表名和列名与实体文件中的表名和列名完全相同

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
这对我有用。以下是我正在使用的版本:

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

对于希望在Postgresql和Spring boot 1.5.2中使用大写字母的用户

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

    public static final long serialVersionUID = 1L;
    public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy();

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

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

}

Spring boot 2.0.0和Hibernate 5

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

protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
    return false;
}

}

如果您在实体类中提供@Table和@Column注释,并且名称带有下划线,即user\u id,即@Column(name=“user\u id”),它将以列名作为user\u id;如果您将其作为userid提供,那么如果您不使用任何策略或隐式策略(特别是spring.jpa.hibernate.naming.implicit strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl),它将更改为user_id。因此,如果您想要一种策略,其中实体属性名称更改为带有下划线和小写字母的名称,即从userId到user_id,您应该使用隐式或无策略(实际上使用隐式策略)

如果不希望命名策略在列名或类名中添加下划线,则需要使用的策略如下:spring.jpa.hibernate.naming.physical strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl。注释@Table和@Column的name属性中提供的内容将保持原样


如果不希望提供注释,并且希望手动处理表名和列名,则应扩展类org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl并重写所需的方法。如果您仍然在这里的某些情况下使用注释,请记住,重写的方法将应用于在这些注释中编写的名称。spring.jpa.hibernate.naming.physical strategy=example.CustomStrategy

有没有办法在Java配置上定义
NamingStrategy
,而不是使用属性文件?显然,这种配置很可能根本不会改变。因此,我想要硬编码的。金色的!这就是我要找的。两个调整
1)公共静态最终PhysicalNamingStrategyImpl实例=新PhysicalNamingStrategyImpl()
应该是
公共静态最终PhysicalNamingStrategSystemAndImpl实例=新PhysicalNamingStrategSystemAndImpl()
2)删除`import java.util.Locale此github线程对Hibernate 4和5都很有用。在土耳其服务器上运行上述代码时要小心
toUpperCase()
项目
转换为
项目
(上面带点的拉丁文大写字母i)。要解决此问题,请始终使用
toUpperCase(Locale.ROOT)
。请详细说明您的答案如何解决OP问题?