Hibernate命名策略更改表名

11 浏览
0 Comments

Hibernate命名策略更改表名

我有点困惑于Hibernate(版本5.1)的命名策略-它改变了我的表名,而我想避免这样做。另外,根据intelij的说法,spring.jpa.hibernate.naming_strategy已经被弃用了,但是我找不到正确配置它的(另一种)方式。\n我在application.properties中有以下配置:\n

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

\n第一个被标记为已弃用,如上所述。\n现在我有一个实体:\n

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

\n表名是,就像在@Table(name = \"\")中一样,usaUploadTable。\n现在当我运行我的应用程序时,我得到了以下错误:\n

\n表\'usertable201.usa_upload_table\'不存在\n

\n这是正确的-它的名字不是Hibernate更改的那样。\n我应该怎么做才能让Hibernate正确使用我的表名?\n编辑:\n我还尝试过\n

DefaultNamingStrategy
ImprovedNamingStrategy

\n它们都会改变它\n版本信息:\n

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

0
0 Comments

Hibernate的命名策略允许开发人员自定义数据库表名和列名的命名规则。然而,在使用Hibernate的命名策略时,可能会遇到一些问题,如在Postgresql和Spring boot 1.5.2中想要将表名转换为大写的情况。

为了解决这个问题,可以创建一个自定义的命名策略类,继承自SpringPhysicalNamingStrategy类,并重写toPhysicalTableName和toPhysicalColumnName方法,将表名和列名转换为大写。

具体代码如下:

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();
    
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }
    
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText().toUpperCase(), true);
    }
}

然而,需要注意的是,在土耳其服务器上运行上述代码时要小心。使用toUpperCase()方法将会将"items"转换为"İTEMS"(带点的拉丁大写字母i)。为了解决这个问题,应该始终使用toUpperCase(Locale.ROOT)方法。

以上是关于Hibernate命名策略中更改表名的问题的原因和解决方法的介绍。通过创建自定义的命名策略类,并重写toPhysicalTableName和toPhysicalColumnName方法,可以将表名和列名转换为大写。同时,在土耳其服务器上使用toUpperCase(Locale.ROOT)方法可以避免字符转换问题。

0
0 Comments

Hibernate命名策略更改表名的问题是在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();
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(name.getText(), name.isQuoted());
    }
    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

现在它使用和实体文件中完全相同的表和列名。

有没有办法通过Java配置来定义NamingStrategy而不是使用属性文件?显然,这是一个很可能根本不会改变的配置。因此,我希望将其硬编码。

太棒了!这正是我在寻找的。两个调整1) public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl(); 应该是 public static final PhysicalNamingStrategyStandardImpl INSTANCE = new PhysicalNamingStrategyStandardImpl(); 2) remove `import java.util.Locale;

我们现在过了6年,这个问题仍然出现,并且这是正确的答案。

0
0 Comments

Hibernate的命名策略对于表名的命名有着一定的规则,但是在某些情况下,用户可能希望更改默认的命名策略。下面是一个关于Hibernate命名策略更改表名的问题的出现原因以及解决方法的整理。

出现的原因:

在使用Hibernate时,默认的命名策略规定了表名的命名规则。然而,某些用户可能希望根据自己的需求更改表名的命名规则。因此,出现了一个关于Hibernate命名策略更改表名的问题。

解决方法:

用户可以通过在配置文件中更改Hibernate的命名策略来解决这个问题。具体来说,用户需要将下面的代码添加到配置文件中:

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

这段代码指定了一个名为"org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"的物理命名策略,用于更改表名的命名规则。

此外,用户还需要注意他们所使用的版本。在上述问题的解决方法中,用户使用的版本如下:

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

这些版本是经过测试的,并且能够与上述的命名策略修改方法兼容。

通过更改Hibernate的命名策略,用户可以自定义表名的命名规则。为了实现这一目标,用户需要在配置文件中添加相应的代码,并确保使用与该代码兼容的版本。这样,用户就可以根据自己的需求更改表名的命名规则了。

0