2012-12-21 29 views
7

Chúng tôi có một tình huống khó khăn.Sử dụng cả phiên JASS EntityManager và Hibernate với trình quản lý giao dịch được chia sẻ trong Spring

  1. Có một dự án lớn sử dụng các tính năng đặc biệt ngủ đông nên không thể thoát khỏi chế độ ngủ đông.
  2. Chúng tôi sẽ thêm công cụ xử lý Activiti vào dự án ở chế độ nhúng và sử dụng các phần mở rộng JPA (chỉ hoạt động với EntityManager)
  3. Một số thực thể không có mặt trong đơn vị liên tục JPA vì tài liệu activiti cho biết tất cả các thực thể phải có @Id và không thể sử dụng @ IdClass/@ EmbeddedId để chúng tôi phải loại trừ các thực thể như vậy khỏi đơn vị liên tục
  4. Chúng tôi muốn sử dụng một trình quản lý giao dịch được chia sẻ cho EntityManager và Session. Các nguồn dữ liệu giống nhau (hoặc thậm chí được chia sẻ)
  5. Mọi thứ đều là Mùa xuân!

Tất cả nỗ lực này là cho phép Activiti sử dụng EntityManager cho phần mở rộng JPA của nó trong khi vẫn cho phép mã phụ thuộc ngủ đông hiện tại tiếp tục hoạt động.

Trả lời

3

Trước hết, điểm thứ 3 của bạn ở trên có thể tỏ ra phức tạp nếu bạn muốn có một đơn vị liên tục và bạn đang sử dụng @ IdClass/@ EmbeddedId trong các thực thể Hibernate của mình. Dưới đây là hai giải pháp khả thi:

  1. Kéo JPA vào dự án của bạn và cấu hình một đơn vị bền vững cho các tổ chức Hibernate hiện tại của bạn, nhưng continute ủy các cuộc gọi hiện có để Hibernate bằng cách truy cập phiên trực tiếp. Trong trường hợp này, cấu hình của bạn sẽ được chuyển sang JPA, nhưng mã của bạn thì không. Cách tiếp cận này cũng giả định rằng bạn có một số trừu tượng hợp lý phân phát các đối tượng Session trong một thời trang có thể cắm được. Xem this question for the crux of the solution. Nếu bạn không linh hoạt ở điểm 3 ở trên, phương pháp này có thể không phải là một lựa chọn cho bạn.

  2. Tạo cả nhà máy phiên và đơn vị liên tục và điều phối giao dịch bằng JTA với hai nguồn dữ liệu XA. Mặc dù dữ liệu của bạn có thể nằm trong cùng một cơ sở dữ liệu, bạn sẽ muốn đảm bảo rằng bạn tạo các nguồn dữ liệu riêng biệt trong cấu hình của mình nếu bạn sử dụng phương pháp này. Điều này sẽ ngăn chặn proxy giao dịch của Spring bị nhầm lẫn khi bạn tham gia vào giao dịch phân tán. Đây có lẽ là cách tiếp cận sạch sẽ nhất, nhưng thực hiện sự kỳ thị của các giao dịch XA, tùy thuộc vào container của bạn, ngày càng nhiều vấn đề chính trị hơn là vấn đề kỹ thuật.

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