Spring 使用 Hibernate 在 TABLE 中使用大写名称启动 JPA 插入
Spring boot JPA insert in TABLE with uppercase name with Hibernate
我有一个 table 实体映射为:
@Entity
public class ItemsToRegister implements Serializable{
@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....
当我尝试在数据库中插入新记录时,table 名称被翻译成小写为:items_to_register,但我的 table 名称是 ITEMS_TO_REGISTER
如何在不更改 MySql 配置的情况下解决我的问题? (my.cnf)
我的 application.properties 文件中有:
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
你可以试试:
@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
...
您需要使用 tics(`) 转义 table 名称以使其区分大小写。
@Table(name = "`ITEMS_TO_REGISTER`")
解决方法是添加:
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
到application.properties
在休眠 5 上,它将是
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
在您的 application.properties 文件中。
正如@jasonleakey 所建议的,我们可以考虑使用如下命名策略。
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
这告诉 Hibernate 完全按照 @Table (name=" ") 或 @Column(name=" ") 中指定的方式生成 SQL。一切顺利。
但请记住 - 在实体 class 中使用不带 @Table、@Column 注释的 PhysicalNamingStrategy 时,hibernate 使用 class 名称和变量名称生成 SQL .考虑以下 java class
Class Employee {
private String firstName;
private String lastName;
}
那么生成的 sql 将是,
select employee0_.firstName,employee0_lastName from Employee employee0_;
不幸的是,这不是一个很好的选择,因为通常我们会将 DB 中的列定义为 FIRST_NAME,LAST_NAME 和 table 名称为 EMPLOYEE。如果您没有使用 PhysicalNamingStrategy,SQL 会是
select employee0_.first_name,employee0_last_name from employee employee0_;
所以这真的是以下两个选项之间的选择。
- 使用 PhysicalStrategy 并使用 @Table 和 @Column 注释在 java 代码中明确定义所有 table 的 names/column 名称。
或
- 在db中定义小写的table名字,让hibernate自动为我们生成tablenames/column名字
您可以实施自己的策略并从 application.properties:
中调用它
spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy
下面是一个始终大写第一个字母的示例
import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
/**
* Singleton access
*/
public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();
@Override
public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
private Identifier capitalize(Identifier name) {
if (name == null)
return null;
if (name.isQuoted())
return name;
String text = StringUtils.capitalize(name.getText());
return Identifier.toIdentifier(text);
}
}
示例中我使用的是H2数据库
使用反引号将 table 名称设为“用户”将使您的数据库中的 table 名称变为小写。
实体class:
Table 数据库中的名称:
P.S。您可以将实体命名为“用户”(大写),无论如何它都会给您“用户”(小写)
来源:
http://coddingbuddy.com/article/56566857/jpa-uppercase-table-names
我有一个 table 实体映射为:
@Entity
public class ItemsToRegister implements Serializable{
@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....
当我尝试在数据库中插入新记录时,table 名称被翻译成小写为:items_to_register,但我的 table 名称是 ITEMS_TO_REGISTER 如何在不更改 MySql 配置的情况下解决我的问题? (my.cnf)
我的 application.properties 文件中有:
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
你可以试试:
@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
...
您需要使用 tics(`) 转义 table 名称以使其区分大小写。
@Table(name = "`ITEMS_TO_REGISTER`")
解决方法是添加:
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
到application.properties
在休眠 5 上,它将是
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
在您的 application.properties 文件中。
正如@jasonleakey 所建议的,我们可以考虑使用如下命名策略。
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
这告诉 Hibernate 完全按照 @Table (name=" ") 或 @Column(name=" ") 中指定的方式生成 SQL。一切顺利。
但请记住 - 在实体 class 中使用不带 @Table、@Column 注释的 PhysicalNamingStrategy 时,hibernate 使用 class 名称和变量名称生成 SQL .考虑以下 java class
Class Employee {
private String firstName;
private String lastName;
}
那么生成的 sql 将是,
select employee0_.firstName,employee0_lastName from Employee employee0_;
不幸的是,这不是一个很好的选择,因为通常我们会将 DB 中的列定义为 FIRST_NAME,LAST_NAME 和 table 名称为 EMPLOYEE。如果您没有使用 PhysicalNamingStrategy,SQL 会是
select employee0_.first_name,employee0_last_name from employee employee0_;
所以这真的是以下两个选项之间的选择。
- 使用 PhysicalStrategy 并使用 @Table 和 @Column 注释在 java 代码中明确定义所有 table 的 names/column 名称。
或 - 在db中定义小写的table名字,让hibernate自动为我们生成tablenames/column名字
您可以实施自己的策略并从 application.properties:
中调用它spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy
下面是一个始终大写第一个字母的示例
import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
/**
* Singleton access
*/
public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();
@Override
public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
@Override
public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
return capitalize(name);
}
private Identifier capitalize(Identifier name) {
if (name == null)
return null;
if (name.isQuoted())
return name;
String text = StringUtils.capitalize(name.getText());
return Identifier.toIdentifier(text);
}
}
示例中我使用的是H2数据库
使用反引号将 table 名称设为“用户”将使您的数据库中的 table 名称变为小写。
实体class:
Table 数据库中的名称:
P.S。您可以将实体命名为“用户”(大写),无论如何它都会给您“用户”(小写)
来源: http://coddingbuddy.com/article/56566857/jpa-uppercase-table-names