2016-08-26 120 views
5

我有點困惑於命名策略休眠(5.1版) - 即它改變我的表名,我想避免這種情況。另外 - spring.jpa.hibernate.naming_strategy似乎根據intelij已被棄用,但我找不到正確配置它的(另一種)方式。休眠命名策略更改表名

我在application.properties以下配置:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy 
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true 
spring.jpa.properties.hibernate.current_session_context_class=thread 

第一個被標記爲depracted,作爲所述。

現在我有一個實體:

@Entity 
@Table(name = "usaUploadTable", schema = "usertable201", catalog = "") 
public class UsaUploadTable { 
    .... 
} 

表名一樣,是在@Table(name = "") usaUploadTable。

現在,當我跑我的申請,我得到

表「usertable201.usa_upload_table」不存在

這是正確的 - 這是不是叫怎麼樣休眠正在改變它。

我能做些什麼來使hibernate正確使用我的表名?

編輯:

我也試過

DefaultNamingStrategy 
ImprovedNamingStrategy 

所有這些改變

版本:

spring-boot-1.4.0.RELEASE 
hibernate 5.1 
javax-transaction-api 1.2 
hibernate-validator 5.2.4 
javassist 3.20 
+0

這github上線是非常有用的兩個休眠4 N 5。 https://github.com/spring-projects/spring-boot/issues/2129 –

回答

2

問題在於彈簧啓動1.4 - 似乎他們已經改變了屬性(或其他),我現在發現這個答案ImprovedNamingStrategy no longer working in Hibernate 5,但它仍然沒有正確解析。所以,我已經改變了代碼一點不使用下劃線方法,並延長新引進類SpringPhysicalNamingStrategy

package com.foo; 

import org.hibernate.boot.model.naming.Identifier; 
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; 
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; 

import java.io.Serializable; 
import java.util.Locale; 


public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable { 

    public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl(); 

    @Override 
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { 
     return new Identifier(name.getText(), name.isQuoted()); 
    } 

    @Override 
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { 
     return new Identifier(name.getText(), name.isQuoted()); 
    } 

} 

而在application.properties我已經改變了棄用線

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl 

現在正如我在實體文件中使用表格和列名一樣。

+0

有沒有辦法通過Java配置來定義'NamingStrategy'而不是使用屬性文件?顯然,這是一個很可能根本不會改變的配置。因此,我想要硬編碼。 –

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

它爲我工作。這裏是我使用的版本:

Spring Boot (v1.4.2.RELEASE) 
Hibernate Core {5.0.11.Final} 
1

對於一個誰願意爲大寫PostgreSQL和春季啓動1.5.2

public class CustomDatabaseIdentifierNamingStrategy extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable { 

    public static final long serialVersionUID = 1L; 
    public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy(); 

    @Override 
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { 
     return new Identifier(name.getText().toUpperCase(), true); 
    } 

    @Override 
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { 
     return new Identifier(name.getText().toUpperCase(), true); 
    } 

} 
+0

在土耳其服務器上運行上述代碼時要小心。 'toUpperCase()'將'items'轉換爲'İTEMS'(拉丁大寫字母i,上面有點)。要解決這個問題,總是使用'toUpperCase(Locale.ROOT)'。 –