2013-01-18 41 views
13

Tôi có một ứng dụng sử dụng Hibernate 4.x và hiện đang sử dụng API Hibernate nguyên bản (có nghĩa là tôi có SessionFactorySession s). Tôi chỉ noticed rằng Tiêu chuẩn API hiện đang phản đối ủng hộ (cấp trên) Tiêu chuẩn API JPA:Tiêu chí/Tiêu chí kiểu JPA Các truy vấn xây dựng từ Hibernate Session

Hibernate cung cấp một già đi, di sản org.hibernate.Criteria API mà nên được coi là phản đối. Không có tính năng phát triển nào sẽ nhắm mục tiêu các API đó. Cuối cùng, các tính năng tiêu chí cụ thể của Hibernate sẽ được chuyển thành các phần mở rộng cho JPA javax.persistence.criteria.CriteriaQuery.

Tôi không muốn phải chuyển đổi ứng dụng của tôi sang sử dụng EntityManager trực tiếp (mặc dù nó rất dễ dàng để có được một Hibernate Session từ đó) bởi vì chúng tôi có một số lượng lớn các tùy chỉnh Hibernate logic cấu hình mà sẽ cần phải được thay thế. Mặc dù vậy, tôi chắc chắn muốn bắt đầu sử dụng API tiêu chí JPA, vì API cũ không được dùng nữa (và có thể sẽ biến mất tại một số điểm ngẫu nhiên trong tương lai, nếu các bản phát hành Hibernate trước đây là bất kỳ dấu hiệu nào) và chúng cũng cung cấp an toàn loại tốt hơn nhiều.

Tôi làm cách nào để sử dụng API CriteriaQuery/CriteriaBuilder mới, nếu tôi đang sử dụng SessionFactory/Session?

+0

Bạn hiện đang nhận phiên của mình như thế nào? Nó ở một vị trí trung tâm? Nếu vậy, bạn sẽ có thể thay đổi điều đó để bạn nhận được các phiên của bạn từ một EntityManager như vậy mà bạn có quyền truy cập vào EM. Vấn đề là Session được sử dụng bởi EntityManager và không phải là cách khác xung quanh.Nhưng nếu bạn sử dụng EntityManager mức cao hơn của bạn và chỉ nhận được Session từ đó (vì vậy bạn không phá vỡ mã cũ), bạn sẽ tốt hơn. –

+0

Đó là một đoạn mã trung tâm, nhưng một phần quan tâm của tôi là chúng tôi có một hệ thống cấu hình khá phức tạp để cấu hình Hibernate (lập trình) và tôi không chắc chắn rằng tôi có thể sao chép với JPA. Nếu tiêu chuẩn Hibernate không được chấp thuận với các Tiêu chuẩn của JPA, nhưng không có cách nào để truy cập nó từ API Hibernate, tôi đã mong đợi rằng họ cũng sẽ không dùng API cấu hình Hibernate (thay vào đó có vẻ như họ đang tiếp tục xây dựng API cấu hình Hibernate) –

+1

Đúng nhưng có vẻ như bạn không thể kết hợp và khớp với JPA và Hibernate theo cách này. Ngay cả khi bạn nhận được cá thể CriteriaQuery mà không có EntityManager, bạn sẽ cần một EM để thực hiện một truy vấn với nó. –

Trả lời

1

Chúng tôi có cùng tiến thoái lưỡng nan trong dự án của mình. Dự án thực sự phức tạp: 90% thực thể được tạo động; có API được thực hiện ở trên API tiêu chuẩn Hibernate, DAO nặng và lớp dịch vụ, được sử dụng rất rộng; phiên bản ngủ đông của chúng tôi được vá nhiều lần để hỗ trợ chức năng cụ thể (như START WITH/CONNECT BY, ARRAY nhập vào oracle và vv); postgresql và oracle được sử dụng cả hai, cách khác, v.v.

API JPA mới sẽ rất hữu ích cho chúng ta. Chúng tôi cần khả năng sử dụng các chức năng ở cấp Tiêu chí API (không HQL) (như NVL/coalesce vì một số lý do hiệu suất, substring, trim và v.v ...). Hơn nữa, chúng ta cần Hibernate Envers chỉ khả dụng cho "EntityManager" triển khai JPA.

Không thích hợp theo kết quả nghiên cứu của chúng tôi, không có khả năng sử dụng API tiêu chí JPA từ bản gốc Hibernate. Envers không thể được sử dụng quá. Dự án Hibernate liên tục phát triển và đạt được các tính năng mới. Di chuyển sang phiên bản ngủ đông mới là nhiệm vụ rất phức tạp đối với chúng tôi. Và chúng tôi rất lo ngại về việc không thể sử dụng nhiều tính năng mới của các phiên bản mới sau khi di chuyển và phát triển với khung cơ bản này.

Do đó chúng ta xem xét hai cách có thể cho chúng tôi: sử dụng SQLCriterion với thực hiện riêng của Expression s (tên cột quyết tâm với CriteriaQuery và dịch to SQL) hoặc chuyển đổi sang "EntityManager"/CriteriaBuilder. Cách thứ hai trông giống như không thể tránh khỏi. Nhưng việc di cư sang thực thi JPA mang lại nhiều vấn đề tiềm ẩn làm hỏng dự án của chúng tôi.

Nếu chúng tôi chọn di chuyển và nó sẽ hữu ích, tôi sẽ để lại ở đây những vấn đề chúng tôi sẽ đấu tranh với trong hoạt động này.

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