我使用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註釋中提供的確切名稱嗎? 我對定義註釋的方式有問題嗎?
[Hibernate 5.1.x命名策略(與Hibernate 4.x向後兼容)]的可能重複](http://stackoverflow.com/questions/37062675/hibernate-5-1-x-naming-strategy-backward-與hibernate-4-x兼容) –
@AmanTuladhar首先,我對重複道歉。經過幾個小時的搜索,我找不到答案。其次,你提供的鏈接與最終使我得出答案的鏈接有關。非常感謝!下面發佈答案。我不敢相信這很簡單。 –