2015-02-17 20 views
16

tôi đã là một thực thể bảng ánh xạ như:mùa xuân khởi động JPA chèn trong TABLE với tên chữ hoa với Hibernate

@Entity 
public class ItemsToRegister implements Serializable{ 

@Id 
@Column(name = "ID_ITEM_TO_REGISTER") 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 
..... 

Khi tôi cố gắng để chèn bản ghi mới trong cơ sở dữ liệu, tên bảng đã được dịch trong chữ thường như: items_to_register, nhưng tên bảng của tôi là ITEMS_TO_REGISTER Làm cách nào để khắc phục sự cố của tôi mà không thay đổi cấu hình MySql? (My.cnf)

tôi có trong application.properties tập tin của tôi:

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy 

Trả lời

43

On Hibernate 5, nó sẽ là

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

trong application.properties bạn tập tin.

+0

Cảm ơn! Điều đó giải quyết vấn đề tương tự cho tôi :) – avivklas

+0

Cảm ơn! Điều đó đã làm việc cho tôi – Adnan

+0

Cảm ơn! Điều này đã giúp tôi rất nhiều! –

2

Bạn có thể thử:

@Entity 
@Table(name = "ITEMS_TO_REGISTER") 
public class ItemsToRegister implements Serializable { 
    ... 
+0

Đây chính là điều làm việc cho tôi. – pgonzaleznetwork

4

Bạn sẽ cần phải thoát khỏi tên bảng với tics (`) để làm cho nó trở nên nhạy cảm.

@Table(name = "`ITEMS_TO_REGISTER`") 
+0

Các tics không hoạt động, nhưng thoát khỏi một dấu ngoặc kép đã làm. I E. '@Table (tên =" \ "ITEMS_TO_REGISTER \" ")'. Tôi đang ở bưu điện và sử dụng eclipselink. Có lẽ điều đó tạo nên sự khác biệt. –

+0

Vâng, đó là cách thích hợp để làm điều đó: với dấu ngoặc kép thông thường (") như Josh C. chỉ ra. Nếu hibernate nhìn thấy, nó trích dẫn định danh cho phù hợp với phương ngữ ví dụ với backticks (') cho MySQL. –

+0

Tôi don 't biết, điều này trông giống như mã cao bồi, nhưng nó hoạt động. –

9

Giải pháp đó là thêm:

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

đến application.properties :)

Yeah !!!

+0

Làm thế nào điều này làm việc cho bạn !! –

+0

Đấng Cứu Rỗi trong ngày. Cảm ơn bạn. –

3

Khi @jasonleakey đề xuất chúng tôi có thể xem xét sử dụng đặt tên-chiến lược như dưới đây.

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

điều này yêu cầu Hibernate tạo SQL chính xác như được chỉ định trong @Table (name = "") hoặc @Column (name = ""). Tất cả tốt.

Nhưng hãy nhớ - trong khi sử dụng PhysicalNamingStrategy không có @Table, chú thích @Column trong lớp thực thể, hibernate tạo SQL bằng tên lớp và tên biến. Hãy xem xét các lớp java dưới

Class Employee { 
    private String firstName; 
    private String lastName; 
} 

thì sql tạo ra sẽ là,

select employee0_.firstName,employee0_lastName from Employee employee0_; 

Thật không may đây không phải là một lựa chọn tuyệt vời như thường chúng ta sẽ định nghĩa các cột trong DB như FIRST_NAME và LAST_NAME và tên bảng như EMPLOYEE. Nếu bạn không sử dụng PhysicalNamingStrategy thì SQL sẽ là

select employee0_.first_name,employee0_last_name from employee employee0_; 

vì vậy nó thực sự là sự lựa chọn giữa hai tùy chọn dưới đây.

  • Sử dụng PhysicalStrategy và xác định rõ ràng tất cả các tên bảng/cột trong mã java bằng chú thích @Table và @Column.
    hoặc
  • Xác định tên bảng chữ thường trong db và cho phép chế độ ngủ đông tự động tạo tên bảng/tên cột cho chúng tôi.
1

Bạn có thể thực hiện chiến lược của riêng bạn và gọi nó từ application.properties:

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy 

Bellow một ví dụ mà luôn tận dụng chữ cái đầu tiên

import java.io.Serializable; 
import org.apache.commons.lang3.StringUtils; 
import org.hibernate.boot.model.naming.Identifier; 
import org.hibernate.boot.model.naming.PhysicalNamingStrategy; 
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; 

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable { 
    /** 
    * Singleton access 
    */ 
    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy(); 

    @Override 
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    @Override 
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { 
     return capitalize(name); 
    } 

    private Identifier capitalize(Identifier name) { 
     if (name == null) 
      return null; 
     if (name.isQuoted()) 
      return name; 
     String text = StringUtils.capitalize(name.getText()); 
     return Identifier.toIdentifier(text); 
    } 
} 
Các vấn đề liên quan