Ignore case sensitive cho tên bảng trong JPA với Hibernate implementation

Khi làm việc với JPA, một vấn đề mà các bạn có thể gặp đó là tên bảng trong database được định nghĩa theo chữ thường nhưng entity mà chúng ta khai báo lại định nghĩa tên bảng là chữ hoa hoặc ngược lại.
Ví dụ, mình có một table với tên bảng được định nghĩa chữ thường như sau:

Nhưng entity của table này thì lại định nghĩa tên bảng là chữ hoa:

Một số hệ thống database thì việc khai báo như thế sẽ không có vấn đề gì, nhưng một số database lại không chấp nhận điều đó. Như mình đang sử dụng MySQL database version 5.7.22 với giá trị của biến lower_case_table_names được set bằng 0 mặc định, việc định nghĩa table và entity như trên sẽ làm mình gặp vấn đề khi sử dụng. Bởi vì, với giá trị 0 của biến lower_case_table_names, các table trong MySQL phải case sensitive, xem thêm tại đây các bạn nhé.

Để các bạn thấy rõ vấn đề là gì, mình sẽ tạo một Maven project đơn giản như sau:

Ignore case sensitive cho tên bảng trong JPA với Hibernate implementation

Maven dependencies:

Định nghĩa của table và entity mình đã đề cập ở trên.

Nội dung tập tin cấu hình của JPA:

Để đơn giản, mình sẽ viết một đoạn code nhỏ để insert một record vào trong table clazz trong class Application như sau:

Khi đó, nếu các bạn chạy ứng dụng, lỗi sau sẽ xuất hiện:

Chúng ta có thể chỉnh sửa cấu hình cho MySQL để set giá trị của biến lower_case_table_names là 2, nhưng hãy tưởng tượng, nếu ứng dụng của các bạn phải chạy trên nhiều môi trường khác nhau, hoặc là các bạn không được phép thay đổi cấu hình của MySQL thì phải làm thế nào?

Để giải quyết vấn đề này, các bạn hãy sửa tập tin cấu hình của JPA để thêm một properties của Hibernate cho phép chúng ta có thể ignore case sensitive của database system mà chúng ta đang chạy.

Nếu các bạn đang sử dụng Hibernate phiên bản 4.x thì propery đó có tên là “hibernate.ejb.naming_strategy” và giá trị của nó là “org.hibernate.cfg.ImprovedNamingStrategy”. Khi đó nội dung của tập tin persistence.xml sẽ là:

Còn nếu đang sử dụng Hibernate 5.x thì property đó có tên là “hibernate.physical_naming_strategy” với giá trị là “com.huongdanjava.jpa.PhysicalNamingStrategyImpl”. Nội dung của class PhysicalNamingStrategyImpl sẽ như sau:

Nội dung của tập tin persistence.xml của mình lúc này như sau:

Trong ví dụ này, mình đang sử dụng Hibernate 5. Chạy lại ứng dụng, các bạn sẽ không thấy lỗi nào nữa.

5/5 - (1 bình chọn)

Add Comment