簡體   English   中英

移動Spring Boot 1.3到1.4,Hibernate 4到5,Pascal案例問題

[英]Moving Spring Boot 1.3 to 1.4, Hibernate 4 to 5, Pascal Case Issues

我用Spring Data JPA和Hibernate創建了一個Spring Boot 1.3.5 POC(這個版本的Spring Boot中的4.3.11.Final)。 我的后端數據庫是Microsoft SQL Server,我們對數據庫對象的標准命名約定是pascal case(例如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,並且不推薦使用spring.jpa.hibernate.naming-strategy屬性,而選擇spring.jpa.hibernate.naming.strategy。 我更改了該屬性名稱,但保留了EJB3NamingStrategy值。 我還更改了其他已棄用的元素:

  • org.springframework.boot.orm.jpa.EntityScan to org.springframework.boot.autoconfigure.domain.EntityScan
  • org.springframework.boot.context.web.SpringBootServletInitializer到org.springframework.boot.web.support.SpringBootServletInitializer
  • org.springframework.boot.test.SpringApplicationConfiguration to org.springframework.boot.test.context.SpringBootTest(在我的測試類中)

現在,生成的SQL使用默認的camel情況來強調命名約定,而不是我使用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注釋中提供的確切名稱? 我定義注釋的方式有問題嗎?

我想說我最后發布了一個愚蠢的問題,但我談到了創建自定義命名策略的每一個方向。 然而,我的答案就是簡單地使用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的鏈接帖子中的這個鏈接是它最終點擊給我的地方。 謝謝!

這對於初學者來說真的是一個很好的線程 - 誰從春季啟動1.3遷移到1.4 - 鏈接下面包含所需的所有擱淺的更改,它還列出了所有已棄用的選項,並包含一些示例。

它概述了幾乎可以與應用程序一起使用的所有內容。 對於ex-Hibernate,Log4j,Junit / Mockito,Integration等。 請點擊以下鏈接

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM