spring data jpaはPostgreSQLテーブル名の列名の大きさを使って書いています。

6574 ワード

最近はspring bootでプロジェクトを開発していますが、開発の過程で一つの問題が発生しました。hibernateはsqlを実行する時、列名が存在しないことをヒントにします。探してみたら、表を作る時、表は大文字で統一されています。ヒベルナは大文字をまとめて小文字に変換します。また、postgreSQLは、大文字小文字に敏感である(実際に表名を大文字にすると、テーブル名が存在しないように注意される)。具体的なエラーは以下の通りです。
Caused by: org.postgresql.util.PSQLException: ERROR: column test0_.id does not exist
私の実体類はこう書きます。
@Entity
@Table(name = "test")
public class Test implements Serializable {
     
	private static final long serialVersionUID = -7768637914227571159L;

    /** 
     * ID
     */
	@Id
	@GeneratedValue(generator = "idGenerator")
	@GenericGenerator(name = "idGenerator", strategy = "identity")
    @Column(name = "ID", nullable = false, length = 10)
    private Long id ;
    
    /** 
     *   
     */
    @Column(name = "NAME", nullable = true, length = 20)
    private String name ;
問題をネットで検索したら、ヒベルナにネーミング戦略があることが分かりました。
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.ImprovedNamingStrategy
列名がラクダ峰の命名法に該当する場合、@Columnの注釈は無効になります。もし自分のニーズを実現するためには、ImprovedNaming Strategyを引き継いでカスタムポリシーを実現する必要がありますが、appication.propertiesでカスタマイズ戦略を実現した後、機能しませんでした。この戦略はhibernation 5の前のバージョンにのみ作用していることが分かりました。(実際にはヒベルナツ5を使っていますが、このネーミングポリシーを設定しても無駄です。大文字を小文字にして下線を付ける形にします。)
検索を続けてみると、hibernate 5は上記のポリシーを二つに分割し、それぞれ
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
その後、PhysicalNaming StrategyStandardImpl類を継承して、中の方法を書き直しました。配置を完成した後、結果はまだ効果がありませんでした。
最後に、このように書くと、表名と列名の大文字小文字が不変であることが分かりました。
//   
@Table("\"TEST\"")
//   
@Column("\"ID\"")
このようにちょっと面倒ですが、各フィールドに対して処理します。でも、問題を解決する一つの方法です。
最善の解決策
  • 実はデータベースを設計する時、MySQLに含まれています。大文字のテーブル名が現れてはいけません。そして、隣の文字の間に下線を使って識別します。
  • じゃ、これからあなたのデータベースデザインを全部小文字に変えて、上のコードを削除します。
    参照
    Spring Data JPA@Columnコメントが無効です。https://www.jianshu.com/p/ba87a9ee6001 Spring Boot+JPA(hibernate 5)開発時、データベース名の大きさは問題を書きます。https://blog.51cto.com/4528195/1983780 spring data jpaはPostgreSQL表の名前を使って書いている問題を解決しています。https://blog.csdn.net/weixin_34000916/article/details/86011813
    後記
    その後、プロジェクトリーダーにデータベースの名前と列名を小文字にして下線を付けるように勧めましたが、最後の結果、組長はこの難しい任務を私に任せました。