2016-08-05 55 views
4

我使用Spring Data JPA和Hibernate(4.3.11.Final在此版本的Spring Boot中)創建了Spring Boot 1.3.5 POC。我的後端數據庫是Microsoft SQL Server,而我們對數據庫對象的標準命名約定是pascal大小寫(例如MySchema.MyTable.MyColumn)。我使用javax.persistence.Table和javax.persistence.Column標註來設置名稱,並將spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.EJB3NamingStrategy添加到我的application.properties文件中。將Spring Boot 1.3遷移到1.4,休眠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.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使用默認的駱駝cas e強調命名約定,而不是我在EJB3NamingStrategy中使用的pascal案例。

//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的參考。那是我必須走的路線嗎?

Hibernate 5有不同的設置,它將使用我在@Table和@Column註釋中提供的確切名稱嗎? 我對定義註釋的方式有問題嗎?

+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生成的查詢再次格式化爲:

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's linkthis link從該職位是它最終點擊了我。謝謝!

+0

這就是我需要的!非常感謝! – pedorro

+0

這對我工作太謝謝了!奇怪的是,我的代碼在本地環境中運行良好,但在AWS EC2 Ubuntu中運行時需要進行上述調整 – philthomas26