2011-06-23 50 views
5

Bạn có thể gọi phương thức yêu cầu giao dịch bên trong phương thức không?Sử dụng @TransactionAttribute (giá trị = TransactionAttributeType.NEVER) trên phương thức

@TransactionAttribute(value = TransactionAttributeType.NEVER) 
public void DoSomething(final List<Item> items) { 

//can you call a method that requires a transaction here ? 
for (Item i : items) { 
    methodCall(item); 

} 

@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
public void methodCall(final Item item) { 
    // access lazily loaded item properties 
    item.getSalesOrder(); 
    item.getAllocation(); 

    //throws org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

} 

Thuộc tính .NEVER cho biết sẽ đảm bảo các phương pháp không chạy bên trong một giao dịch nhưng những gì về cuộc gọi đến các phương pháp khác bên trong phương pháp mà

+0

Bạn có thể áp dụng chú thích @TransactionAttribute ở cấp lớp để chỉ định thuộc tính giao tác mặc định cho tất cả các phương thức kinh doanh của bean doanh nghiệp. Bạn có thể áp dụng chú thích này ở cấp phương thức để xác định thuộc tính giao tác cho phương thức đó. Áp dụng chú thích ở cấp phương thức sẽ ghi đè chú thích cấp lớp (nếu có) cho phương thức đó. – Luke

Trả lời

9

Chú thích chỉ xác định tình trạng giao dịch cần phải tồn tại khi phương thức chú thích được gọi (trong trường hợp này một giao tác không được tồn tại). Nó không hạn chế những gì có thể xảy ra trong quá trình thực thi phương thức chú thích. Vì vậy, trong phương thức này bạn có thể bắt đầu một giao dịch mới mà không có bất kỳ vấn đề gì.

Trong ví dụ bạn đã cung cấp, bạn có thể gọi phương thức yêu cầu giao dịch từ bên trong phương thức có cài đặt giao dịch KHÔNG BAO GIỜ. Trong tình huống này, một giao dịch mới sẽ được tạo cho cuộc gọi phương thức yêu cầu giao dịch. Nếu phương thức bên trong được đánh dấu bằng thiết lập MANDATORY, thì cuộc gọi phương thức bên trong sẽ thất bại vì giao dịch hiện tại không tồn tại và cài đặt MANDATORY không tự động tạo một cho bạn.

+0

Cảm ơn bạn đã xóa thông tin đó. Tôi có thể thấy không có lý do tại sao nó sẽ không hoạt động tuy nhiên tôi không thể truy cập vào các thuộc tính được nạp lazeless bên trong lời gọi phương thức bên trong (mặc dù nó được chú thích với yêu cầu mới) – Luke

+0

Làm thế nào bean cấp cao nhất của bạn có quyền truy cập vào bean bên trong ('itemBean ')? Thùng chứa 'itemBean' có được quản lý tốt hay bạn đã trực tiếp khởi tạo nó (chú thích giao dịch chỉ được hỗ trợ trên bean được quản lý)? Ngoài ra, các thuộc tính được nạp lười mà bạn đang tham chiếu là gì và chúng được liên kết với giao dịch như thế nào (nếu có)? –

+0

Mỗi mục có một đơn đặt hàng và một phân bổ được nạp lazily cũng như các thuộc tính khác không liên quan đến giao dịch cụ thể này. Trong trường hợp này cả hai phương thức đều nằm trên cùng một bean, vì vậy ví dụ mã của tôi không nên có tiền tố itemBean. – Luke

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