2009-03-19 27 views
8

Thay vì có các hành động cơ sở dữ liệu nằm rải rác trong bốn gói (osgi), tất cả đều có những thứ hơi khác nhau. Tôi muốn tạo một gói OSGi (đơn giản) chịu trách nhiệm cho tất cả các vấn đề liên tục. Tôi cảm thấy rằng điều này không đơn giản như nó nghe vì điều "bộ nạp lớp duy nhất cho mỗi gói". Vì vậy, những gì tôi thực sự sẽ đánh giá cao là nếu ai đó biết (các) giải pháp cho loại vấn đề này.OSGi + Hibernate

Trả lời

4

(Nếu bạn đang sử dụng Hibernate Annotations)

Lưu tất cả các bộ tải lớp Đối tượng khi bó Hibernate được thông báo về một lớp học được chú thích.

Sau đó thực hiện một việc như thế này trước khi tạo SessionFactory của bạn.

ClassLoad cl = Thread.currentThread().getContextClassLoader(); 
try { 
Thread.currentThread().setContextClassLoader(yourClassLoader); 
factory = cfg.buildSessionFactory(); 
}finally { 
Thread.currentThread().setContextClassLoader(cl); // restore the original class loader 
} 
5

Có hai cách tôi có thể nghĩ để giải quyết vấn đề tải lớp.

  • Bạn có gắn với Khung công cụ OSGi cụ thể không hoặc bạn có muốn ở mức tương thích nhất có thể không? Hoặc bạn có thể sử dụng equinox để thực hiện của bạn? Trong Equinox bạn có một cơ chế gọi là Buddy Classloading. Phần bổ sung này cho phép bạn tăng khả năng hiển thị của các lớp nhất định giữa các gói OSGi khác nhau. Nếu bạn quan tâm đến chủ đề này, tôi muốn hướng dẫn bạn đến hai bài viết sau: Understanding how Eclipse plug-ins work with OSGi, Eclipse - a tale of two VMs (and many classloaders).
  • Nếu bạn muốn duy trì việc thực thi OSGi độc lập, bạn có thể xem xét việc giải nén các lớp của mình, mà bạn muốn tồn tại, thành một gói riêng biệt mà cả gói Hibernate-Bundle và các gói khác của bạn phụ thuộc. Bằng cách đó, tất cả họ đều có quyền truy cập vào định nghĩa lớp của các lớp được duy trì.
1

Chỉ tìm thấy một phương pháp thú vị trong lớp Bundle/api.

public java.lang.Class loadClass(java.lang.String name) throws java.lang.ClassNotFoundException 

Điều này phải giải quyết một số vấn đề về trình tải lớp?

1

tôi sẽ khuyên bạn nên tránh xa bạn thân lớp bốc vì nó là đặc trưng cho của Eclipse thực hiện Equinox và, theo ý kiến ​​của tôi, người nhận được nó để làm việc nhưng họ không hiểu tại sao và tất cả mọi người kết thúc lên như một người bạn của mọi người khác. Điều này ngăn cản bạn hiểu được cách thức hoạt động của lớp OSGi và các mẫu bạn cần sử dụng (trình nạp lớp tổng hợp, tải lớp ngữ cảnh, các dịch vụ OSGi, ...) để làm việc với nó.

Nếu gói kiên trì của bạn biết trước những loại cần phải tồn tại, thì gói có thể nhập tất cả các gói bắt buộc (Require-Bundle là ác) chứa các lớp miền của bạn.

Quản lý bộ nạp lớp ngữ cảnh (như trong thư trả lời của Roger) có thể trợ giúp với Hibernate, mặc dù tôi khuyên bạn nên sử dụng thứ gì đó như Spring dm để ẩn đằng sau dịch vụ OSGi.