2016-08-26 15 views
5

Tôi hơi bối rối bởi chiến lược đặt tên (phiên bản 5.1) hibernates - cụ thể là nó thay đổi tên bảng của tôi và tôi muốn tránh điều đó. Ngoài ra - spring.jpa.hibernate.naming_strategy dường như không được dùng nữa theo intelij, nhưng tôi không thể tìm thấy cách cấu hình chính xác (nother).Hibernate đổi tên chiến lược đổi tên bảng

tôi có cấu hình như sau trong 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 

Người đầu tiên được đánh dấu là depracted, như đã nói.

Bây giờ tôi có một thực thể:

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

Tên bảng là, giống như trong @Table(name = "") usaUploadTable.

Bây giờ khi tôi chạy ứng dụng của tôi, tôi nhận được

Bảng 'usertable201.usa_upload_table' không tồn tại

đó là chính xác - nó không được đặt tên như thế nào ngủ đông đang thay đổi nó .

Tôi có thể làm gì để làm cho ngủ đông sử dụng tên bảng chính xác?

Edit:

Tôi cũng đã thử

DefaultNamingStrategy 
ImprovedNamingStrategy 

Tất cả trong số họ thay đổi nó

phiên bản:

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

này chủ đề github rất hữu ích cho cả Hibernate 4 n 5. https://github.com/spring-projects/spring-boot/issues/2129 –

Trả lời

2

Vấn đề nằm ở lò xo khởi động 1,4 - nó có vẻ như họ đã thay đổi các thuộc tính (hoặc bất cứ điều gì) Tôi đã tìm thấy câu trả lời này ImprovedNamingStrategy no longer working in Hibernate 5, nhưng nó vẫn không giải quyết chính xác. Vì vậy, tôi đã thay đổi mã một chút để không sử dụng phương pháp gạch và để mở rộng các lớp mới được giới thiệu 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()); 
    } 

} 

Và trong application.properties Tôi đã thay đổi dòng phản đối để

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

Bây giờ nó sử dụng chính xác tên bảng và cột khi tôi có chúng trong tệp thực thể của mình.

+0

Có cách nào để xác định 'NamingStrategy' trên cấu hình Java thay vì với tệp thuộc tính không? Rõ ràng, đó là một cấu hình mà hầu như chắc chắn sẽ không thay đổi chút nào. Tôi muốn có mã hóa cứng đó. –

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

nó làm việc cho tôi. đây là các phiên bản tôi đang sử dụng:

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

Đối với một ai muốn chữ hoa trong PostgreSQL và khởi động mùa xuân 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

Hãy cẩn thận khi chạy mã trên trên máy chủ Thổ Nhĩ Kỳ. 'toUpperCase()' sẽ chuyển đổi 'các mục' thành' İTEMS' (chữ cái latin latin i có dấu chấm ở trên). Để khắc phục điều này, luôn sử dụng 'toUpperCase (Locale.ROOT)'. –

Các vấn đề liên quan