2010-07-26 9 views
12
  1. हमारे पास बेस जेनेरिक मैनेजर है जो सभी प्रबंधकों द्वारा विरासत में मिला है। बेस प्रबंधक @ ट्रांस्सेक्शन एनोटेशन के साथ एनोटेट किया गया है।@ ट्रान्सएक्शनल एनोटेशन

  2. व्यवहार सेवाओं के 2 समूहों के होते हैं: - transactionManager1

  3. x.y.service2.* द्वारा प्रबंधित किया जा करने के लिए है -

    • x.y.service1.* द्वारा transactionManager2

कैसे प्रबंधित करने के लिए है बिना लेनदेन के लेनदेन कॉन्फ़िगर किया जा सकता है सभी लेनदेन संबंधी तरीकों को ओवरराइड करने और लेनदेन प्रबंधक निर्दिष्ट करने के लिए?

@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); 
    } 
} 

अधिकांश शायद मैं @Transactional टिप्पणी के साथ aop गठबंधन करने के लिए की जरूरत है।
दरअसल, मैं क्या चाहता हूं:
1) लेनदेन को कॉन्फ़िगर करने में सक्षम होने के लिए (केवल ध्वज, प्रचार, अलगाव आदि पढ़ें) @ ट्रांस्सेक्शन एनोटेशन के साथ।
2) रणनीति को परिभाषित मेरी कक्षाओं (AOP का उपयोग कर के बाहर लेनदेन प्रबंधक चुनने के लिए, उदाहरण के)
xyservice1 के लिए * -।> का उपयोग txManager1
xyservice2 * -।> का उपयोग txManager2

क्या यह संभव है ?

उत्तर

1

मुझे लगता है कि आप कक्षा स्तर के

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

मैंने केवल पढ़ा है केवल आधार प्रबंधक में केवल विधियों को नहीं पढ़ा है। मैं 2 विकल्प यहाँ हैं: 1) है श्रेणी स्तर एनोटेशन @Transactional (केवल पढ़ने = सच) और हर नहीं पढ़ के लिए विधि स्तर एनोटेशन @Transactional (केवल पढ़ने = false) केवल तरीकों 2) (कक्षा के स्तर का एनोटेशन @Transactional है पढ़ने के लिए केवल = झूठी) और विधि स्तर एनोटेशन @ ट्रान्सएक्शनल (readOnly = true) प्रत्येक पढ़ने के लिए केवल किसी भी मामले में मुझे उन सेवाओं के लिए विधि स्तर @transactional एनोटेशन को ओवरराइड करने की आवश्यकता होगी जिन्हें txManager2 – Seyran

10

वहाँ @Transactional(value="tx1") के लिए शॉर्टकट के रूप में create your own annotations की संभावना है पर @Transactional परिभाषित कर सकते हैं। संदर्भ दस्तावेज़ से

(ये वर्ग या विधि स्तर पर इस्तेमाल किया जा सकता):

उदाहरण के लिए, निम्नलिखित एनोटेशन

@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 { 
} 

हमें

के रूप में पिछले अनुभाग से उदाहरण लिखने के लिए अनुमति देता है परिभाषित करने
public class TransactionalService { 

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

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

+1, अच्छा विचार प्रबंधित करना है। दुर्भाग्यवश, – Bozho

+0

मेरा नहीं। मैंने केवल इसे देखा :-) –

+0

हां, मुझे पता है कि मैं मेटा एनोटेशन का उपयोग कर सकता हूं। लेकिन यह विन्यास की बस सरलीकरण है। मुझे अभी भी विधि को ओवरराइड करने की आवश्यकता होगी और इसे @OrderTx – Seyran

संबंधित मुद्दे