Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 Spring boot JPA在表中插入,大写名称为Hibernate_Java_Mysql_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring boot JPA在表中插入,大写名称为Hibernate

Java Spring boot JPA在表中插入,大写名称为Hibernate,java,mysql,hibernate,jpa,spring-data-jpa,Java,Mysql,Hibernate,Jpa,Spring Data Jpa,我有一个表实体映射为: @Entity public class ItemsToRegister implements Serializable{ @Id @Column(name = "ID_ITEM_TO_REGISTER") @GeneratedValue(strategy = GenerationType.AUTO) private int id; ..... 当我尝试在数据库中插入新记录时,表名以小写形式翻译为:items_to_register,但我的表名是items_to_re

我有一个表实体映射为:

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....
当我尝试在数据库中插入新记录时,表名以小写形式翻译为:items_to_register,但我的表名是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(name = "`ITEMS_TO_REGISTER`")

解决方案是添加:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

对于hibernate 5上的
application.properties

,它将

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

应用程序.properties文件中spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 这告诉Hibernate按照@Table(name=“”)或@Column(name=“”)中的指定生成SQL。一切都好

但是请记住,在实体类中使用不带@Table、@列注释的PhysicalNamingStrategy时,hibernate使用类名和变量名生成SQL。考虑下面的java类< /P>
Class Employee {
   private String firstName;
   private String lastName; 
}
那么生成的sql将是

select employee0_.firstName,employee0_lastName from Employee employee0_;
不幸的是,这不是一个很好的选择,因为通常我们会将DB中的列定义为FIRST_NAME和LAST_NAME,表名定义为EMPLOYEE。如果您没有使用PhysicalNamingStrategy,SQL将是

select employee0_.first_name,employee0_last_name from employee employee0_;
因此,这实际上是在以下两个选项之间的选择

  • 使用PhysicalStrategy并使用@Table和@column注释在java代码中显式定义所有表名/列名。
  • 在db中定义小写的表名,让hibernate自动为我们生成表名/列名

您可以实施自己的策略并从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);
    }
}

抽搐不起作用,但逃避双引号起了作用。例如,
@Table(name=“\”项目注册\”)
。我在参加博士后考试,正在使用eclipselink。也许这会有所不同。是的,这是正确的做法:如Josh C.所指出的,使用常规引号(“)。如果hibernate看到这些,它会适当地为方言引用给定的标识符,例如使用反勾(`)对于MySQL。如何使用hibernate 3?我认为最好的方法是始终使用PhysicalNamingStrategy,用小写字母@table(name=“name_in_lowercase”)显式定义表名。并设置数据库以保持表名为小写字母(对于MySQL,小写字母\表名=1)。