Hibernate命名策略更改表名
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
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)方法可以避免字符转换问题。
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年,这个问题仍然出现,并且这是正确的答案。
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的命名策略,用户可以自定义表名的命名规则。为了实现这一目标,用户需要在配置文件中添加相应的代码,并确保使用与该代码兼容的版本。这样,用户就可以根据自己的需求更改表名的命名规则了。