5

Spring Data JPA と Hibernate を使用して Spring Boot 1.3.5 POC を作成しました (このバージョンの Spring Boot では 4.3.11.Final)。私のバックエンド データベースは Microsoft SQL Server で、データベース オブジェクトの標準命名規則はパスカル ケースです (例: MySchema.MyTable.MyColumn)。javax.persistence.Table および javax.persistence.Column アノテーションを使用して名前を設定し、spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy を application.properties ファイルに追加しました。

すべてが完璧に機能しました。問題なくSpring Boot 1.3.6に更新しました。

今、私は Hibernate 5.0.9.Final を使用する Spring Boot 1.4.0.RELEASE に移行しました。そのプロパティ名を変更しましたが、EJB3NamingStrategy の値は残しました。他の廃止された要素も変更しました。

  • org.springframework.boot.orm.jpa.EntityScan から org.springframework.boot.autoconfigure.domain.EntityScan
  • org.springframework.boot.context.web.SpringBootServletInitializer から org.springframework.boot.web.support.SpringBootServletInitializer
  • org.springframework.boot.test.SpringApplicationConfiguration から org.springframework.boot.test.context.SpringBootTest (私のテストクラス)

生成された SQL では、EJB3NamingStrategy で使用したパスカル ケースではなく、デフォルトのキャメル ケースを使用して命名規則を強調しています。

//application.properties
spring.data.jpa.repositories.enabled=true
spring.data.solr.repositories.enabled=false
spring.data.mongodb.repositories.enabled=false
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.EJB3NamingStrategy
#spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy

//hibernate.properties
hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
hibernate.format_sql=true

//Principal.java
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.Size;

import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Entity
@Table(name="Principal", schema="Security")
@Audited
@AuditTable(value = "Principal", schema = "Audit")
public class Principal {

    private static final Logger LOG = LoggerFactory.getLogger(Principal.class);

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "Id", 
            nullable = false)
    private Long id;

    @Column(name = "Username", 
            nullable = false, 
            unique = true)
    @Size(min = 1, max = 64)
    private String name;

    @Column(name = "FirstName", 
            nullable = false)
    @Size(min = 1, max = 64)
    private String firstName;

    @Column(name = "LastName", 
            nullable = false)
    @Size(min = 1, max = 128)
    private String lastName;

    @Column(name = "IsEnabled", 
            nullable = false)
    private boolean enabled;

    //getters/setters omitted for brevity
}

元のコンソール出力:

Hibernate: 
    select
        principal0_.Id as Id1_8_,
        principal0_.IsEnabled as IsEnable2_8_,
        principal0_.FirstName as FirstNam3_8_,
        principal0_.LastName as LastName4_8_,
        principal0_.Username as Username5_8_ 
    from
        Security.Principal principal0_ 
    where
        principal0_.Username=?

新しいコンソール出力:

Hibernate: 
    select
        principal0_.id as id1_7_,
        principal0_.is_enabled as is_enabl2_7_,
        principal0_.first_name as first_na3_7_,
        principal0_.last_name as last_nam4_7_,
        principal0_.username as username5_7_ 
    from
        security.principal principal0_ 
    where
        principal0_.username=?
2016-08-05 09:19:22.751  WARN 5032 --- [  XNIO-2 task-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 207, SQLState: S0001
2016-08-05 09:19:22.751 ERROR 5032 --- [  XNIO-2 task-8] o.h.engine.jdbc.spi.SqlExceptionHelper   : Invalid column name 'is_enabled'.
2016-08-05 09:19:22.768 ERROR 5032 --- [  XNIO-2 task-8] io.undertow.request                      : UT005023: Exception handling request to /springbootsecurity/login

広範囲に検索したところ、ImplicitNamingStrategy と PhysicalNamingStrategy への参照が見つかりました。しかし、それらを差し込むことはうまくいかないようで、おそらく正しいアプローチではありません。また、独自の NamingStrategy を作成することへの言及も見てきました。それは私が取らなければならないルートですか?

@Table および @Column アノテーションで指定した正確な名前を使用する Hibernate 5 の別の設定はありますか? 注釈を定義する方法に問題はありますか?

4

2 に答える 2

8

ばかげた質問を投稿してしまったと言いたいのですが、私が行ったすべての方向は、カスタム命名戦略の作成について話しました. ただし、私の場合の答えは、単純に Hibernate の PhysicalNamingStrategyStandardImpl を使用することでした。

application.properties に追加:

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

私の素朴な分析から、 @Table および @Column アノテーションを使用しているため、これが機能すると想定しています。PhysicalNamingStrategyStandardImpl は、単にこれらの注釈の名前をデータベース オブジェクト名として使用しているように見えます。

したがって、Hibernate で生成されたクエリは、次のようにフォーマットされます。

Hibernate: 
    select
        principal0_.Id as Id1_7_,
        principal0_.IsEnabled as IsEnable2_7_,
        principal0_.FirstName as FirstNam3_7_,
        principal0_.LastName as LastName4_7_,
        principal0_.Username as Username5_7_ 
    from
        Security.Principal principal0_ 
    where
        principal0_.Username=?

@AmanTuladhar のリンクとその投稿のこのリンクを読むと、最終的にクリックされました。ありがとう!

于 2016-08-05T20:48:00.183 に答える
0

これは本当に素晴らしいスレッドです。Spring Boot 1.3 から 1.4 に移行している初心者にとって、以下のリンクには必要なすべての孤立した変更が含まれており、非推奨のオプションもすべてリストされており、いくつかの例も含まれています。

アプリケーションで使用できるほとんどすべての概要を示します。ex-Hibernate、Log4j、Junit/Mockito、統合など。以下のリンクに従ってください

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes

于 2018-07-02T13:46:01.157 に答える