2009-11-24 34 views
6

Thực tiễn tốt nhất để sử dụng Giao dịch cơ sở dữ liệu với Seam khi không sử dụng EJB - nghĩa là gì. khi triển khai Seam như một WAR?Giao dịch thủ công với Seam POJO

Theo mặc định Seam JavaBeans hỗ trợ Giao dịch. Tôi có thể chú thích một phương thức với @Transactional và điều đó sẽ đảm bảo rằng một giao dịch là bắt buộc. Hoặc tôi có thể sử dụng @Transactional (KHÔNG BAO GIỜ) hoặc @Transactional (MANDATORY). Những gì tôi không thể tìm ra làm thế nào để làm là tạo ra giao dịch của riêng tôi, thiết lập một thời gian chờ, bắt đầu và sau đó cam kết/rollback.

Tôi đã cố gắng sử dụng:

UserTransaction utx = Transaction.instance(); 
utx.setTransactionTimeout(2000); 
utx.begin(); 

Nhưng nó hoặc được bỏ qua nếu một giao dịch đã cơ bản dở dang hoặc trả về một javax.transaction.NotSupportedException nếu tôi chú thích phương pháp này với @Transactional (KHÔNG BAO GIỜ)

Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn.

+0

cho tên đầy đủ của @Transactional – Bozho

+0

org.jboss.seam.annotations.Transactional – Damo

Trả lời

8

Như bạn biết, Quản lý giao dịch là một mối quan tâm chéo. Vì vậy, nó không phải là một ý tưởng tốt mã của bạn nằm rải rác về trong các mô-đun mà những mối quan tâm không phải là mối quan tâm chính của họ.

Nếu bạn đang sử dụng JTA UserTransaction trong môi trường không phải EJB, vì vậy JTA là sẵn có (Apache Tomcat không hỗ trợ JTA).

1 ° quy tắc

quản lý giao dịch Seam được kích hoạt theo mặc định cho tất cả các yêu cầu JSF (Seam 2.0+).

Tôi nghĩ Seam quản lý giao dịch âm thanh tốt hơn khi Giao dịch của Seam quản lý. Nó có nghĩa là Seam quan tâm, đằng sau hậu trường, gọi điện thoại bắt đầu và cam kết. Seam đóng vai trò của người quản lý giao dịch bằng cách sử dụng một Giám đốc Seam giao dịch

1 ° kịch bản: POJO + JTA sẵn (Apache Tomcat không hỗ trợ JTA) Quản lý

giao dịch được sử dụng bởi đường may: org.jboss.seam .transaction.UTtransaction

Enabled theo mặc định trong môi trường không EJB (chiến tranh) khi JTA sẵn (JBoss hỗ trợ JTA)

Nếu bạn đang sử dụng JPA EntityManager hoặc Hibernate Session, bạn cần đăng ký họ cho phép Seam quản lý ranh giới giao dịch

Xem 9.3. Seam-managed persistence contexts làm thế nào để thiết lập một Seam quản lý bối cảnh kiên trì (đúc bằng @In)

Sau đó tiêm một EntityManager (EntityManager) hoặc Session (Hibernate) bằng cách sử dụng @In (scoped để ScopeType.Conversation)

@Name("businessService") 
public class BusinessServiceImpl implementes BusinessService { 

    @In 
    private EntityManager entityManager; 

    public void doSomething() { 
     // You do not need to call entityManager().getTransaction().begin(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
     // Therefore, if you call entityManager().getTransaction().begin() 
     // You will get IllegalStateException 

     // Some EntityManager operations persist, find etc 

     // You do not need to call entityManager().getTransaction().commit(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
    } 

} 

Đằng sau hậu trường, Seam giao dịch quản lý tranh thủ sự EntityManager (JPA) hoặc Session (Hibernate) trong hoạt động JTA UserTransaction, bằng cách gọi joinTransaction phương pháp

2 ° kịch bản: POJO + RESOURCE_LOCAL (hoặc Hibernate hay JPA) giao dịch

quản lý giao dịch được sử dụng bởi Seam (JPA): org.jboss.seam.transaction.EntityTransaction

TRANSA ction quản lý được sử dụng bởi Seam (Hibernate): org.jboss.seam.transaction.HibernateTransaction

Xem 9.3. Seam-managed persistence contexts làm thế nào để thiết lập một Seam quản lý bối cảnh kiên trì (đúc bằng @In)

Đằng sau hậu trường, giao dịch Seam Quản lý chăm sóc gọi bắt đầu và cam kết trong công nghệ cơ bản bằng cách sử dụng proxy

3 ° kịch bản: EJB

giao dịch quản lý được sử dụng bởi Seam: org.jboss.seam.transaction.CMTTransaction

Bật theo mặc định trong môi trường EJB. Hãy cẩn thận, trong trường hợp đó, Seam không kiểm soát giao dịch được quản lý bởi container.

regards,

5

Cách Tôi hiện đang làm việc là như thế này:

//don't use @Transactional annotation 
public void doStuff() { 
    UserTransaction userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction"); 
    userTx.setTransactionTimeout(10 * 60); //set timeout to 60 * 10 = 600 secs = 10 mins 
    userTx.begin(); 

    /*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */ 
    entityManager.joinTransaction(); 

    //do stuff  

    entityManager.persist(user); 
    entityManager.flush(); //logs will show an insert at this point 

    userTx.commit(); //or rollback() 
} 

Nhưng nếu một giao dịch đã diễn ra và bạn muốn tham gia nó sau đó bạn sử dụng userTx.isActive() vv

+0

xuất sắc người đàn ông !!! Tôi có thể sử dụng điều này để tránh ngoại lệ "Giao dịch không hoạt động". – prageeth

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