2011-10-22 16 views

Trả lời

57

Chúng nặng và chúng được cho là nằm trong phạm vi ứng dụng. Vì vậy, bạn cần phải mở chúng khi khởi động ứng dụng và đóng chúng khi tắt ứng dụng.

Cách thực hiện điều đó tùy thuộc vào vùng chứa mục tiêu của bạn. Nó có hỗ trợ EJB 3.x (Glassfish, JBoss AS, vv) không? Nếu vậy, thì bạn không cần phải lo lắng về việc mở/đóng chúng (không phải về các giao dịch) tại tất cả nếu bạn chỉ cần thực hiện công việc JPA trong EJB với @PersistenceContext theo cách thông thường:

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

    public Foo find(Long id) { 
     return em.find(Foo.class, id); 
    } 

    // ... 
} 

Nếu container mục tiêu của bạn không không hỗ trợ các EJB (ví dụ Tomcat, Jetty, vv) và một phần bổ sung EJB như OpenEJB cũng không phải là một lựa chọn vì lý do nào đó, và do đó bạn không tự mình tự mình tạo ra EntityManager s (và giao dịch). là ServletContextListener. Dưới đây là một cơ bản Kickoff dụ:

@WebListener 
public class EMF implements ServletContextListener { 

    private static EntityManagerFactory emf; 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     emf = Persistence.createEntityManagerFactory("unitname"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     emf.close(); 
    } 

    public static EntityManager createEntityManager() { 
     if (emf == null) { 
      throw new IllegalStateException("Context is not initialized yet."); 
     } 

     return emf.createEntityManager(); 
    } 

} 

(lưu ý: trước khi Servlet 3.0, lớp này cần phải được đăng ký bởi <listener> trong web.xml thay vì @WebListener)

Mà có thể được sử dụng như:

EntityManager em = EMF.createEntityManager(); 
// ... 
+0

Ví dụ tuyệt vời như mọi khi nhưng chỉ muốn thêm rằng khi sử dụng @PersistenceContext không có thuộc tính "unitName", nó ngụ ý (i n một cách không khai báo) sử dụng duy nhất/mặc định persistence-đơn vị được định nghĩa trong "persistence.xml". Nếu có nhiều nguồn dữ liệu/persistence-units, nó có thể dẫn đến một số nhầm lẫn là cái nào. –

+0

Không chắc chắn những gì khác là mất tích, tôi làm theo câu trả lời của bạn nhưng có một lỗi thời gian chạy? > Gây ra bởi: org.springframework.beans.factory.NoSuchBeanDefinitionException: Không có bean duy nhất của kiểu [javax.persistence.EntityManagerFactory] được định nghĩa: bean đơn dự kiến ​​nhưng được tìm thấy 0: – huahsin68

+3

@ huahsin68: Câu hỏi ban đầu không liên quan đến Mùa xuân chút nào và tôi cũng không làm mùa xuân. Chỉ cần nhấn "Đặt câu hỏi". – BalusC

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