2010-07-26 37 views
12
  1. Chúng tôi có người quản lý chung chung mà tất cả các nhà quản lý đều thừa kế. Trình quản lý cơ sở được chú thích với chú thích @Transactional.Nhiều người quản lý giao dịch có chú thích @Transactional

  2. Có 2 nhóm dịch vụ giao dịch:

    • x.y.service1.* - đã được quản lý bởi transactionManager1
    • x.y.service2.* - đã được quản lý bởi transactionManager2

thế nào giao dịch có thể được định cấu hình mà không có sự thiếu để ghi đè TẤT CẢ các phương thức giao dịch và chỉ định trình quản lý giao dịch?

@Transactional(readOnly = true) 
public abstract class GenericManagerImpl<D extends IGenericDao, T extends BaseObject, PK extends Serializable> 
     implements IGenericManager<T, PK> { 

    protected D dao; 

    @Autowired 
    public void setDao(D dao) { 
     this.dao = dao; 
    } 


    @Transactional(readOnly = false) 
    public void save(T object) { 
     dao.save(object); 
    } 

    @Transactional(readOnly = false) 
    public void remove(T object) { 
     dao.remove(object); 
    } 


} 

@Service 
class UserManagerImpl 
     extends GenericManagerImpl<IUserDao, User, Long> 
     implements IUserManager { 

// Everything is OK. User is managed by txManager1 

} 

@Service 
class BillingManagerImpl 
     extends GenericManagerImpl<IBillingDao, Billing, Long> 
     implements IBillingManager { 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void save(final Billing billing) { 
     super.save(billing); 
    } 

    @Override 
    @Transactional(readOnly = false, value="txManager2") // <--have to override method only to specify txManager 
    public void remove(final Billing billing) { 
     super.remove(billing); 
    } 
} 

lẽ Hầu hết tôi cần phải kết hợp với aop chú thích @Transactional.
Thực ra, điều tôi muốn là:
1) Để có thể định cấu hình giao dịch (chỉ đọc cờ, chuyển hướng, cách ly, v.v.) bằng chú thích @Transactional.
2) xác định chiến lược để lựa chọn quản lý giao dịch bên ngoài lớp học của tôi (sử dụng AOP, ví dụ)
xyservice1 * -.> Sử dụng txManager1
xyservice2 * -.> Sử dụng txManager2

Có thể ?

Trả lời

1

Tôi đoán bạn có thể định nghĩa @Transactional tại lớp cấp

@Service 
@Transactional(readOnly = false, value="txManager2") 
class BillingManagerImpl .... 
+0

Tôi đã đọc chỉ adn KHÔNG chỉ đọc các phương thức trong trình quản lý cơ sở. Tôi có 2 lựa chọn ở đây: 1) có trình độ lớp chú thích @Transactional (readonly = true) và mức độ phương pháp chú thích @Transactional (readonly = false) cho mỗi KHÔNG chỉ đọc phương pháp 2) có trình độ lớp chú thích @Transactional (readOnly = false) và chú thích mức phương thức @Transactional (readOnly = true) cho mọi phương thức chỉ đọc Trong mọi trường hợp, tôi sẽ cần ghi đè chú thích @transactional cho các dịch vụ phải được quản lý bởi txManager2 – Seyran

10

Có khả năng create your own annotations như các phím tắt cho @Transactional(value="tx1"). (Đây có thể được sử dụng tại lớp hoặc cấp phương pháp)

từ các tài liệu tham khảo:

Ví dụ, xác định các chú thích sau

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("order") 
public @interface OrderTx { 
} 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("account") 
public @interface AccountTx { 
} 

cho phép chúng tôi viết ví dụ từ phần trước như

public class TransactionalService { 

    @OrderTx 
    public void setSomething(String name) { ... } 

    @AccountTx 
    public void doSomething() { ... } 
    } 
+0

+1, ý tưởng hay. – Bozho

+0

không phải của tôi, thật không may. Tôi chỉ nhìn nó lên :-) –

+0

Vâng, tôi biết rằng tôi có thể sử dụng chú thích meta. Nhưng điều này chỉ đơn giản là cấu hình. Tôi vẫn sẽ cần ghi đè phương thức và chú thích nó bằng chú thích như @OrderTx – Seyran

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