Hibernate命名策略更改表名

时间:2016-08-26 09:29:00

标签: java mysql spring hibernate jpa

我对hibernates(版本5.1)命名策略感到有点困惑 - 即它改变了我的表名,我想避免这种情况。另外 - spring.jpa.hibernate.naming_strategy似乎根据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

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

现在我有一个实体:

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

表名称与@Table(name = "") usaUploadTable类似。

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

  

表'usertable201.usa_upload_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

5 个答案:

答案 0 :(得分:8)

<img id="Change Lights" src="https://placehold.it/36x98/ff0000" width="36" height="98">



<script>
  var img = ["https://placehold.it/36x98/ffbf00","https://placehold.it/36x98/00ff00","https://placehold.it/36x98/ff0000"];

  var imgElement = document.getElementById("Change Lights");
  var lights = 0;
  var imgLen = img.length;

  function nxt() {
    if (lights < imgLen - 1) {
      lights++;
    } else {
      lights = 0;
    }

    imgElement.src = img[lights];
  }
  
  setInterval(nxt,2000);
</script>
它对我有用。以下是我使用的版本:

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

答案 1 :(得分:3)

问题在于spring-boot-1.4 - 看起来他们已经改变了我现在找到这个答案ImprovedNamingStrategy no longer working in 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

现在它正好使用我的实体文件中的表名和列名。

答案 2 :(得分:1)

对于想要在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);
    }

}

答案 3 :(得分:0)

如果您在实体类中提供@Table和@Column批注,并且其名称带有下划线,即user_id,即@Column(name =“ user_id ”),则它将列名作为用户身份;如果您将其指定为用户ID,则如果您不使用任何策略或隐式策略(特别是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

答案 4 :(得分:-1)

Spring boot 2.0.0&amp; Hibernate 5

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

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

}