2011-09-30 32 views
14

Đâ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:

  1. 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?

  2. Tại sao chú thích @Resource và @PersistenceContext thay vì @ManagedProperty hoặc có lẽ @Inject được sử dụng?

  3. 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ể)?

  4. 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.

+0

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

+0

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

Trả lời

11
  1. Do UserTransaction là một phần của Java Transaction API (JTA) và EntityManager là một phần của Java Persistence API (JPA). JTA không thuộc JPA. JPA sử dụng các dịch vụ do JTA cung cấp.

  2. Không phải là ManagedProperty là một số chú thích chỉ hợp lệ trong các lớp được chú thích bằng @ManagedBean. Có lẽ nó được coi là tốt hơn để không tiêm UserTransaction cách khác nhau trong đậu được quản lý.

  3. Tra cứu JNDI cho giao dịch hiện hoạt. Tên dự trữ có vẻ là java: comp/UserTransaction. Một triển khai: http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. Nó không phải là một số loại singleton, bạn có thể có nhiều hơn một. Nhưng chỉ một cho mỗi chủ đề có thể hoạt động.

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