2012-04-24 39 views
8

Tôi vừa bắt đầu một thử nghiệm Java đơn giản, quản lý một số thực thể sử dụng Hibernate và cung cấp một giao diện REST để thao tác các đối tượng này và cung cấp thêm một số logic nghiệp vụ. Giao diện REST được tạo ra bằng RESTEasy và Jetty.Tạo Hibernate-Session theo yêu cầu

Mọi thứ hoạt động tốt cho đến nay, nhưng tôi có cảm giác rằng tôi đang viết quá nhiều mã bản mẫu. Vì tôi không có nhiều kinh nghiệm trong các khung công tác Java này, tôi chỉ tự hỏi liệu có ai có thể cho tôi một gợi ý về cách cải thiện tình hình.

  1. Creting Hibernate phiên cho mỗi yêu cầu

Vâng, như xa như tôi hiểu tôi phải tạo ra một phiên Hibernate theo yêu cầu và cuối cùng tôi phải đóng nó lại. Vì vậy, hiện tại tất cả các phương thức dịch vụ của tôi trông giống như sau:

Session session = HibernateUtil.getInstance().getSessionFactory().openSession(); 
... 
... 
... 
session.close(); 

Có cách nào để xóa hai dòng này để tự động thực hiện điều này không? Hiện tại dịch vụ của tôi đã được đăng ký là một singleton RestEASY. Sẽ thay đổi thành một Ressource RESTeasy và tạo phiên trong constructor giải quyết vấn đề? Tôi nghĩ rằng nó sẽ giải quyết vấn đề tạo phiên. Nhưng ở đâu để đóng nó?

Trong C++, điều này có thể dễ dàng thực hiện là tạo một đối tượng phạm vi để đóng phiên ở cuối. Nhưng trong Java?

  1. Bất cứ khi nào yêu cầu REST được thực hiện, tôi phải kiểm tra phiên hợp lệ (người dùng phải đăng nhập trước đó). Là một ServletFilter đúng cách để làm điều này?

Chung: Tôi có nên sử dụng bất kỳ mẫu hoặc khuôn khổ nào khác không? Tôi có nghĩa là tôi muốn giữ nó đơn giản nhất có thể và đặc biệt là khi tôi không có nhiều kinh nghiệm, tôi không muốn kết thúc bằng cách sử dụng Spring hoặc bất kỳ khuôn khổ hạng nặng nào. Dường như tôi đã quen với sự đơn giản của Python và Django nhưng đối với dự án nhỏ này, tôi phải sử dụng Java.

THanks cho đến nay!

Trả lời

3

pháp được đề nghị hiện tại của Hibernate để quản lý phiên là chi tiết về wiki page này. Đặc biệt, tôi nghĩ bạn cần phải đọc đoạn cuối cùng: This is all very difficult, can't this be done easier?

Cuối cùng, bạn cần phải nói với lớp kiên trì rằng "Tôi chuẩn bị làm điều gì đó" (thường cũng được phiên làm việc đó với) và "Tôi đã làm xong". Bạn có thể làm điều đó với annotations hoặc JTA transactions, nhưng thông tin đó vẫn phải được truyền đạt!

0

Bạn nên thử viết Bộ lọc để thực hiện việc này. OpenSessionInViewFilter của Spring là một nơi tốt để bắt đầu nếu bạn cần một ví dụ.

1

Tiêm SessionFactory cho đối tượng truy cập dữ liệu của bạn và sử dụng sessionFactory.getCurrentSession() để truy cập đối tượng phiên Hibernate. bạn có thể tận dụng bất kỳ của các lớp Nhà máy có sẵn để thực hiện điều này ..

Sau đó, mã của bạn sẽ trông như thế này ..

sessionFactory.getCurrentSession().save(newInstance); 
+6

Ok, nhưng tôi phải đóng phiên làm việc ở đâu? – duselbaer

+1

Trong trường hợp struts2, u có thể sử dụng bộ chặn để khởi tạo và đóng đối tượng phiên. –

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