Spring boot 1.5.4 JPAを使用すると、Mysqlで大文字と小文字を区別する問題が発生します.

2981 ワード

最近Spring Bootフレームワークに基づくアプリケーションが開発されており,Mysqlで大文字と小文字を区別する問題に遭遇している.
開発前期に私はずっと本機のWindowsシステムで創立したデータベースを使って、それからデータベースをLinuxの上に移して、大文字で創立した表、フィールドJPAを使ってすべて存在しないことを提示して、JPAがバックグラウンドで印刷するSQL文もすべて小文字で、もとはJPAがデフォルトで表名などを小文字に変換したので、下の2種類の解決方法を研究しました:
  • MySQLのcnfを変更mysqlを閉じて変更/etc/my.cnf追加設定...[mysqld]lower_case_table_names=1...mysql
  • を起動
  • PhysicalNamingStrategy Spring Boot 1.5.4 JPAはhibernate 5.0に基づいており、PhysicalNamingStrategyを実現する2つの既存の方法がある
  • org.hibernate.boot.model.naming.P h o y s icalNamingStrategyStandardImpl無修正
  • org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyに変更があり、Spirng Boot 1.5.4デフォルトではSpringPhysicalNamingStrategyが使用され、「-」の追加処理が行われ、テーブル、フィールド名が小文字アプリケーションに変換されます.ymlではPhysicalNamingStrategyを使用するように構成されています.
  • spring:
      jpa:
        hibernate:
          naming:
            physical-strategy:  org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  • カスタムインプリメンテーションPhysicalNamingStrategyたとえばSpringPhysicalNamingStrategyを使用したい場合、名前を小文字に変換しないでカスタムインプリメンテーションしたい場合は、SpringPhysicalNamingStrategyのisCaseInsensitiveメソッドでは、データベースが大文字と小文字を区別するかどうかを指定するために使用されますが、実装されていません.
  • protected Identifier getIdentifier(String name, boolean quoted,JdbcEnvironment jdbcEnvironment) {
            if (isCaseInsensitive(jdbcEnvironment)) {
                name = name.toLowerCase(Locale.ROOT);
            }
            return new Identifier(name, quoted);
    }
    
    protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
            return true;
    }

    ここでSpringPhysicalNamingStrategyを継承し、再びisCaseInsensitiveメソッドで戻り値をfalseに変更し、SpringPhysicalNamingStrategyルールを満たしてもテーブル名などを小文字に変換しません.
    public class MySQLUpperCaseStrategy extends SpringPhysicalNamingStrategy {
        @Override
        protected boolean isCaseInsensitive(JdbcEnvironment jdbcEnvironment) {
            return false;
        }
    }

    PhysicalNamingStrategyを実装すると、テーブル名に接頭辞、接尾辞など、カスタマイズされた名前処理を満たすことができます.