2011-01-12 24 views
6

Một dự án tôi làm việc trên (sử dụng Java, Spring, Hibernate) gần đây đã thay đổi từ Oracle sang MySQL. Có một vài trường hợp trong đó một số thuộc tính trong mã là các từ dành riêng trong MySQL, chẳng hạn như "phát hành".Hibernate: sử dụng backticks cho MySQL nhưng không cho HSQL

Có một vài giải pháp, 1) đổi tên thuộc tính trong mã và phương thức getter/setter tiếp theo, cũng cập nhật mã gọi các phương thức 2) chú thích thuộc tính trong mã bằng @Column (name = "` release` "). Điều này cho phép hibernate báo giá tên khi nói chuyện với cơ sở dữ liệu.

Tôi muốn tránh xa cách tiếp cận đầu tiên để giảm cơ hội phá vỡ nhiều nội dung hơn. Cách tiếp cận thứ hai là "ok", ngoại trừ nó trở thành MySQL cụ thể. Trong dev của chúng tôi. thiết lập chúng tôi sử dụng HSQL mà không thích backticks xung quanh những tên cột.

Tôi đã xem lớp org.hibernate.mapping.Column và tôi thấy nó có phương thức "getQuotedName" mà tôi có khả năng ghi đè nếu tôi có thể phân lớp cột và cho Hibernate sử dụng lớp Cột của riêng tôi.

Cách tốt nhất để giải quyết vấn đề này dựa trên cách tiếp cận ưa thích của a) không phải cấu trúc lại codebase (b/c thay đổi tên thuộc tính, phương thức getter/setter, vv) và b) làm việc trong HSQL và MySQL.

Sẽ hợp lý khi có thuộc tính trong tệp thuộc tính có thể được bật để bật/tắt một số sửa chữa đặt tên Cột. Mà nhắc tôi, tôi đã thử bằng cách sử dụng một chiến lược đặt tên tùy chỉnh và ghi đè phương thức "columnName" để bao quanh tên cột trong backticks ... điều này không hoạt động, ngay cả trên MySQL.

+1

Dường như có một thuộc tính mới hibernate.globally_quoted_identifiers (http://opensource.atlassian.com/projects/hibernate/browse/HHH-4453) có thể được sử dụng (như ngủ đông 3,5 tôi tin) nhưng không được ghi lại (http://opensource.atlassian.com/projects/hibernate/browse/HHH-5673). Đây không phải là một lựa chọn cho tôi vì tôi đang sử dụng Hibernate 3.3 – codecraig

+0

Tôi vừa trả lời câu hỏi của bạn và tôi không biết về câu hỏi này. Đây là lần đầu tiên tôi thấy một câu hỏi chính xác hơn câu trả lời :-) – jpkrohling

Trả lời

1

Giải pháp ve sau rất tốt. Nhưng nếu nó không hoạt động hoặc bạn không muốn sử dụng một tính năng không có giấy tờ của một nhà cung cấp JPA cụ thể: Tại sao không sử dụng các tên cột không được bảo lưu trong bất kỳ cơ sở dữ liệu nào (hoặc phổ biến nhất).

Bạn không cần thay đổi tên thuộc tính java của mình, bạn chỉ phải chỉ định tên cột cho chúng.

+0

Điểm tốt ... thật dễ dàng. Tôi thích có tên thuộc tính phù hợp với tên cột trong db nhưng nó không phải là một yêu cầu và tôi có thể đổi tên tên cột trong DB để rõ ràng là rất gần với tên thuộc tính Java. – codecraig

0

Sử dụng backtips. Đó là cách bạn nói với Hibernate rằng bạn muốn định danh đó được trích dẫn đúng cách. Nó chỉ là một sự trùng hợp ngẫu nhiên mà backticks cũng được sử dụng như là ký tự trích dẫn cho MySQL. Backtick này sẽ được dịch sang bất kỳ ký tự trích dẫn nào cho cơ sở dữ liệu của bạn. Về việc thêm dấu ngoặc kép làm hành vi mặc định, tôi không chắc Hibernate có tùy chọn như vậy. Không có gì trong tài liệu đề cập đến một lựa chọn có thể, và tôi không nhớ nhìn thấy bất cứ điều gì như thế này trong bộ thử nghiệm là tốt. Nhưng tôi không nghĩ đó là một ý tưởng hay, vì "từ khóa dành riêng" là ngoại lệ, không phải là quy tắc.

+0

Vì vậy, tôi nên thêm @Column (name = "' .... '") vào bất kỳ thuộc tính nào là từ dành riêng trong mã của tôi? Tôi đã thử sử dụng chiến lược đặt tên và ghi đè phương thức "columnName" để thêm vào và nối thêm vào các tên cột nhưng nó phàn nàn, ngay cả trong MySQL với ngoại lệ như: org.hibernate.MappingException: Cột vật lý giống nhau tên cột logic: foobar.'thing_id' => ''thing_id'' và 'thing_id' – codecraig

+0

Có, @Column (name =" '' something'' ") là cách tiếp cận thông thường. Tôi nghi ngờ rằng việc thay đổi chiến lược đặt tên có thể làm việc quá và lỗi này bạn đang thấy là một lỗi, nhưng tôi sẽ cần gỡ lỗi thêm để xác nhận.Trong mọi trường hợp, có vẻ như bạn đã tìm thấy một tài sản để báo giá toàn bộ tất cả số nhận dạng. Đó cũng sẽ là một giải pháp. – jpkrohling

+0

Có thuộc tính đó cho số nhận dạng báo giá toàn cầu có thể hoạt động nếu tôi đang sử dụng Hibnerate 3.5 hoặc mới hơn, nhưng hiện tại tôi bị mắc kẹt ở mức 3.3. Tôi sẽ thử @Column. Tôi đã viết một kịch bản Python để kiểm tra tất cả các tên cột trong SQL DDL để xem chúng có sử dụng các từ dành riêng không và có vẻ như tôi chỉ có một cột duy nhất là vấn đề ngay bây giờ, vì vậy có thể tái cấu trúc mã trong trường hợp này. t là xấu, kể từ khi Hibernate dường như có một cách tiếp cận tốt hơn (ví dụ như sử dụng tài sản toàn cầu) khi sử dụng một phiên bản mới hơn. – codecraig

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