Cách tiếp cận tốt nhất để lấy EntityManagerFactory trong ứng dụng web (jsp/servlets) là gì. đây có phải là cách tốt hay không When should EntityManagerFactory instance be created/opened?, hoặc tốt hơn là lấy nó từ JNDI, hoặc cái gì khác ...Thực hành tốt nhất để có được EntityManagerFactory
Trả lời
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();
// ...
- 1. Thực hành tốt nhất để viết bookmarklets
- 2. NamedQuery: Thực hành tốt nhất
- 3. htaccess thực hành tốt nhất
- 4. cmake thực hành tốt nhất
- 5. Thực hành tốt nhất của Windows Registry
- 6. theo dõi Bug thực hành tốt nhất
- 7. Pattern Repository Thực hành tốt nhất
- 8. Thực hành tốt nhất C# và Excel
- 9. Hướng dẫn thực hành tốt nhất: Swing
- 10. Thực hành tốt nhất cho mẫu DAO?
- 11. NuGet và TFS thực hành tốt nhất
- 12. Bố cục SVN - thực hành tốt nhất
- 13. Thực hành tốt nhất của Redmine
- 14. Thực hành tốt nhất C++ cho hằng
- 15. Thực hành tốt nhất cho tệp typedefs
- 16. Ghi đè Ext.data.Connection - Thực hành tốt nhất
- 17. Thực hành SQLite tốt nhất trên iPhone
- 18. Thực hành tốt nhất về mảnh vỡ
- 19. Dependency Injection Thực hành tốt nhất
- 20. Hibernate Performance Thực hành tốt nhất?
- 21. HttpRuntime.Các thực hành tốt nhất của Apache
- 22. Thực hành tốt nhất D3 và TDD
- 23. release Vs nil - Thực hành tốt nhất
- 24. WSDL - không có đầu vào - thực hành tốt nhất
- 25. CSS Outline thực hành tốt nhất
- 26. Thực hành tốt nhất để lưu trữ cài đặt
- 27. Thực hành tốt nhất để tra cứu Java Enum
- 28. Thực hành tốt nhất để phát âm mã C
- 29. Thực hành tốt nhất để sử dụng @ trong C#
- 30. Thực hành tốt nhất để giải quyết lỗi URI
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. –
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
@ 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