2016-08-05 6 views
4

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

すべてが完全に機能しました。私はSpring Boot 1.3.6にも問題なくアップデートしました。

今、私はHibernate 5.0.9.Finalを使用するSpring Boot 1.4.0.RELEASEに移りました。そして、spring.jpa.hibernate.naming-strategyプロパティは、spring.jpa.hibernate.naming.strategyのために廃止されました。 。私はそのプロパティ名を変更しましたが、EJB3NamingStrategy値は残しました。

  • org.springframework.boot.orm.jpa.EntityScan
  • org.springframework.boot.context.webをorg.springframework.boot.autoconfigure.domain.EntityScanする:私はまた、他の非推奨の要素を変更しました。 (私のテストクラス内)org.springframework.boot.test.context.SpringBootTestにSpringBootServletInitializer org.springframework.boot.web.support.SpringBootServletInitializer
  • org.springframework.boot.test.SpringApplicationConfiguration今

生成されたSQLはデフォルトのcamel casを使用しますeは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 
} 

のorignalのコンソール出力:

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の設定はありますか? 注釈を定義する方法に問題はありますか?

+0

[Hibernate 5.1.xネーミング戦略(Hibernate 4.xと下位互換性があります)]の可能な複製](http://stackoverflow.com/questions/37062675/hibernate-5-1-x-naming-strategy-backward- hibernate-4-xと互換性があります) –

+0

@AmanTuladharまず、私の複製についての謝罪。私は何時間もの検索の後に答えを見つけることができませんでした。第二に、あなたが提供したリンクは、最終的に私を答えに導いたものへのリンクを持っていました。どうもありがとう!答えは以下の通りです。私はそれが簡単だとは信じられません。 –

答えて

7

私は愚かな質問を投稿してしまったと言いたいと思いますが、私はすべての方向でカスタム命名戦略を作成するように話しました。私の場合の答えは、単純に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はクエリが再びとしてフォーマットされて生成された:それは最終的に私のためにクリックした場所、そのポストから@AmanTuladhar's linkthis linkを読む

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=? 

です。ありがとう!

+0

これは私が必要なものです!どうもありがとうございます! – pedorro

+0

これは私にも感謝しました!奇妙なことに、私のコードはローカル環境で正常に動作しましたが、AWS EC2 Ubuntuで実行する場合は上記の調整が必要でした – philthomas26

関連する問題