Đây là câu hỏi học thuật; Tôi không có mã bị hỏng liên quan đến điều này. Tôi chỉ muốn mở rộng sự hiểu biết của tôi về những gì đang xảy ra dưới mui xe.Làm thế nào để UserTransaction và EntityManager tương tác?
Mã mẫu tôi đã được sử dụng (sao chép từ sách vở và hướng dẫn) trong JPA DAO của tôi cho các ứng dụng web JSF điển hình của tôi là về cơ bản này:
public class someDAO {
@PersistenceContext protected EntityManager em;
@Resource private UserTransaction utx;
public void persist(Entity entity) {
try {
utx.begin();
em.persist(entity);
utx.commit();
} catch (// gawd awful long list of possible exceptions)
// etc
Vì vậy, câu hỏi của tôi như sau:
Tại sao đối tượng EntityManager và cá thể UserTransaction được chèn với chú thích từ hai gói có vẻ không liên quan?
Tại sao chú thích @Resource và @PersistenceContext thay vì @ManagedProperty hoặc có lẽ @Inject được sử dụng?
Cách truy cập kiên trì() phương pháp và tương tác với đối tượng utx? Nếu tôi quên utx.begin() hãy gọi cho người quản lý thực thể biết về điều đó và ném và ngoại lệ. Nó phải tìm đối tượng UserTransaction theo một cách kỳ diệu nào đó. Nó sẽ không có kiến trúc tốt hơn để xác định giao diện như: em.persist (utx, thực thể)?
Nếu utx là một số loại singleton - có thể mở nhiều lần một UserTransaction không?
Cảm ơn rất nhiều vì đã thảo luận.
Bạn có cân nhắc đến EJB không? EJB sử dụng giao dịch được quản lý vùng chứa. Bằng cách này, bạn không cần phải lo lắng về việc quản lý giao dịch cho mình (và nó giữ cho các phương pháp dịch vụ của bạn không bị lộn xộn). – BalusC
Các mẫu mã của tôi được học từ các sách như Burns JSF 2. Tôi không quan tâm đến mẫu mã này nhiều vì tôi đã quản lý để giữ tất cả các mẫu được giới hạn trong một đối tượng DAO trừu tượng. Tất cả các DAO cụ thể của tôi mở rộng từ một đối tượng để junky này (nếu từ đó áp dụng) một phần của nó là khá nhiều trong tầm nhìn. Nhưng không phải trong tâm trí. – AlanObject