2013-08-08 33 views
8

Khi nghiên cứu cách triển khai chiến lược đặt tên tùy chỉnh (chỉ dành cho tên bảng), tôi tình cờ gặp một sự không nhất quán mà tôi không thể giải quyết. (Tôi đang sử dụng chế độ ngủ đông-core 3.6.6.Final trên JBoss 6.1.0.Final với PostgreSQL 9.1.9)hibernate mà đặt tên chiến lược là mặc định

Dường như có ba triển khai xây dựng trong cho NamingStrategy:

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy

Giá trị mặc định dường như được thiết lập để EJB3NamingStrategy trong org.hibernate.cfg.Configuration.

Tuy nhiên, tên bảng dường như được đặt theo chiến lược, không khớp với bất kỳ điều nào ở trên.

Ví dụ:
tên Class: package.ClassName
tên bảng Kết quả: classname

Chiến lược 1 và 2 chỉ cần gọi StringHelper.unqualify(className) mà chỉ đơn giản loại bỏ tất cả các tên gói và dấu chấm, vì vậy kết quả nên ClassName.

Chiến lược 3 loại bỏ tất cả tên gói và dấu chấm, sau đó đặt dấu gạch dưới trước mỗi chữ cái được camelcased và cuối cùng chuyển thành chữ thường, sẽ mang lại class_name.

(Mã nguồn của chế độ ngủ đông 4.1.0.Có vẻ như không thay đổi trong các lớp này.)

Có thể giúp tôi làm rõ điều này không?

Trả lời

3

Rất dễ dàng! Bởi vì tôi không muốn dành thời gian để tạo ra môi trường đồ chơi với hibernate-core 3.6.6.Final Tôi cung cấp cho bạn hướng dẫn cách kiểm tra xem cá thể nào đã sử dụng CHÍNH XÁC TRONG ỨNG DỤNG LÀM VIỆC CỦA BẠN.

Cài đặt visualvm trên máy chủ của bạn. Nó cho phép tạo đống kết xuất cho ứng dụng cục bộ. Để tạo đống đổ trên máy chủ remove - chạy trên máy chủ:

jmap -dump:format=b,file=heap.dump $PID 

mở bãi trong visualvm và chạy OQL truy vấn:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator") 

Đó là BẠN đặt tên CHIẾN LƯỢC. Bạn có thể sử dụng tab "Sơ thẩm" để điều hướng qua phân cấp tham chiếu để biết các loại thực tế khác nhau của hbm hoặc jpa NamingStrategy được sử dụng.

Phiên bản Hibernate khác nhau có các trường và loại được khai báo khác nhau. Nếu không có lĩnh vực namingStrategyDelegator thử đào để dụ:

heap.objects('org.hibernate.cfg.Configuration') 

Nếu lớp đó không có trong các phiên bản của Hibernate - hãy thử đọc tài liệu và các nguồn và tìm lớp phù hợp.

Với sự phụ thuộc org.hibernate:hibernate-entitymanager:jar:4.3.11.Final tôi có:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator") 
     == org.hibernate.cfg.naming.LegacyNamingStrategyDelegator 

và nó sử dụng nội bộ:

LegacyHbmNamingStrategyDelegate 
LegacyJpaNamingStrategyDelegate 

tùy thuộc vào những món quà của các chú thích JPA. Trong mọi trường hợp, trường hợp này tham chiếu đến LegacyNamingStrategyDelegator (yea, tham chiếu tuần hoàn!) Có trường namingStrategy với trường hợp org.hibernate.cfg.EJB3NamingStrategy.

Đó là tất cả! Tôi dành 1 phút để tìm cách thực hiện chiến lược đặt tên mặc định trong wepapp và 5 phút để viết bài đăng này ((

Cảm ơn bạn đã xem, hacking hạnh phúc!