Tôi có một cái gì đó không quốc tịch đậu như:EJB3 giao dịch Tuyên truyền
@Stateless
public class MyStatelessBean implements MyStatelessLocal, MyStatelessRemote {
@PersistenceContext(unitName="myPC")
private EntityManager mgr;
@TransationAttribute(TransactionAttributeType.SUPPORTED)
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
this.process(obj);
}
}
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
// do some work with obj that must be in the scope of a transaction
this.mgr.merge(obj);
// ...
this.mgr.merge(obj);
// ...
this.mgr.flush();
}
}
này thường sử dụng sau đó là khách hàng sẽ gọi processObjects (...), mà không thực sự tương tác với người quản lý thực thể. Nó làm những gì nó cần phải làm và gọi quá trình (...) riêng cho từng đối tượng để xử lý. Thời gian của quá trình (...) là tương đối ngắn, nhưng processObjects (...) có thể mất một thời gian rất dài để chạy qua tất cả mọi thứ. Do đó tôi không muốn nó duy trì một giao dịch mở. Tôi do cần các quy trình riêng lẻ (...) hoạt động để hoạt động trong giao dịch của riêng họ. Đây sẽ là giao dịch mới cho mọi cuộc gọi. Cuối cùng tôi muốn giữ cho các tùy chọn mở cho khách hàng để gọi quá trình (...) trực tiếp.
Tôi đã thử một số loại giao dịch khác nhau: không bao giờ, không được hỗ trợ, được hỗ trợ (trên processObjects) và bắt buộc, yêu cầu mới (trên quy trình) nhưng tôi nhận được TransactionRequiredException mỗi khi hợp nhất() được gọi.
tôi đã có thể để làm cho nó hoạt động bằng cách chia lên các phương pháp thành hai hạt cà phê khác nhau:
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
@EJB
private MyStatelessBean2 myBean2;
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
this.myBean2.process(obj);
}
}
}
@Stateless
public class MyStatelessBean2 implements MyStatelessLocal2, MyStatelessRemote2 {
@PersistenceContext(unitName="myPC")
private EntityManager mgr;
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
// do some work with obj that must be in the scope of a transaction
this.mgr.merge(obj);
// ...
this.mgr.merge(obj);
// ...
this.mgr.flush();
}
}
nhưng tôi vẫn tò mò nếu nó có thể thực hiện điều này trong một lớp. Dường như với tôi như người quản lý giao dịch chỉ hoạt động ở cấp độ bean, ngay cả khi các phương thức riêng lẻ được đưa ra các chú thích cụ thể hơn. Vì vậy, nếu tôi đánh dấu một phương pháp theo cách ngăn chặn giao dịch bắt đầu gọi các phương thức khác trong cùng một trường hợp đó cũng sẽ không tạo giao dịch, bất kể chúng được đánh dấu như thế nào?
Tôi đang sử dụng Máy chủ ứng dụng JBoss 4.2.1.GA, nhưng các câu trả lời không cụ thể được chào đón/ưa thích.
Chỉ cần nghĩ rằng tôi sẽ ghé qua và chia sẻ điều đó vì hỏi câu hỏi này vấn đề này đã xuất hiện nhiều lần (tình cờ, sếp của tôi nói rằng anh ta đã tìm ra câu hỏi này qua Google một lần trong khi cố gắng giải quyết nó.) Chúng tôi đã sử dụng giải pháp này một số lần, vì vậy cảm ơn một lần nữa. –
Tôi nghĩ đây là một câu hỏi hay để biết. Bạn mong đợi những ngữ nghĩa này nếu bạn phải làm bất cứ điều gì từ thế giới EJB2, nhưng chúng có vẻ hơi lạ nếu bạn chỉ làm việc trong EJB3. Một cách khác để xem xét mọi thứ là bạn cần đảm bảo phương thức mà bạn đang gọi được gọi là * thông qua giao diện EJB *. – cwash