5

मैं स्प्रिंग डेटा नियो 4 जे 2.0 में सरल ऑब्जेक्ट/ग्राफ़ मैपिंग का उपयोग कर रहा हूं, जहां मैं स्प्रिंग डेटा रिपोजिटरी फ्रेमवर्क का उपयोग करके दृढ़ता संचालन करता हूं। मैं नियो 4jTemplate के साथ काम करने के बजाय भंडार के साथ काम कर रहा हूँ। मैं अपने स्प्रिंग वेब एमवीसी नियंत्रकों में भंडार इंजेक्ट करता हूं, और नियंत्रक सीधे रिपोज़ को कॉल करते हैं। (कोई इंटरमीडिएट सर्विस लेयर नहीं - मेरे ऑपरेशंस आम तौर पर सीआरयूडी और खोजक प्रश्न होते हैं।)स्प्रिंग डेटा नियो 4j की सरल ऑब्जेक्ट/ग्राफ़ मैपिंग का उपयोग करके लेनदेन प्राप्त करने का सही तरीका?

जब मैं पढ़ता हूं, तो कोई समस्या नहीं होती है। लेकिन जब मैं लिखने के संचालन करता हूं, तो मुझे "NotInTransactionException" मिलता है। मेरी समझ यह है कि Neo4j में पढ़े गए ओप को लेनदेन की आवश्यकता नहीं होती है, लेकिन ओप लिखते हैं।

यहां तस्वीर में लेन-देन करने का सबसे अच्छा तरीका क्या है, मानते हुए कि मैं साधारण ओजीएम के साथ रहना चाहता हूं? मैं @ ट्रांसेक्शनल का उपयोग करना चाहता हूं, लेकिन इसे विभिन्न रिपोजिटरी इंटरफेस पर रखना काम नहीं करता है। यदि मैं नियंत्रकों और रिपॉजिटरीज़ के बीच एक इंटरमीडिएट सेवा स्तर पेश करता हूं और फिर @ ट्रान्सैक्शनल के साथ सेवा बीन्स को एनोटेट करता हूं, तो यह काम करता है, लेकिन मैं सोच रहा हूं कि ऐसा करने का एक आसान तरीका है या नहीं। स्प्रिंग डेटा के बिना, मुझे आम तौर पर डीएओ (रिपोजिटरी) कार्यान्वयन तक पहुंच होगी, इसलिए यदि मैं पास-थ्रू सेवा स्तर से बचना चाहता हूं तो मैं कंक्रीट डीएओ को @ ट्रान्सएक्शनल के साथ एनोटेट करने में सक्षम हूं। वसंत डेटा के साथ रेपो गतिशील रूप से जेनरेट किए जाते हैं ताकि यह एक विकल्प न हो।

+1

@ रिपोजिटरी-इंटरफेस पर ट्रांसेक्शनल काम करना चाहिए। –

उत्तर

6

सबसे पहले, ध्यान दें कि लेनदेन संबंधी डीएओ आमतौर पर एक अच्छा अभ्यास नहीं है। लेकिन अगर आपके पास सर्विस लेयर नहीं है, तो इसे डीएओ पर रहने दें।

फिर, आप घोषणात्मक लेनदेन को सक्षम कर सकते हैं। यहाँ कैसे मैंने किया है:

सबसे पहले, एक एनोटेशन को परिभाषित @GraphTransactional कहा जाता है:

@Retention(RetentionPolicy.RUNTIME) 
@Transactional("neo4jTransactionManager") 
public @interface GraphTransactional { 

} 

अद्यतन: वसंत-डेटा-neo4j, इस तरह के एक एनोटेशन जोड़ लिया है, तो आप इसे बजाय एक नया बनाने का पुन: उपयोग कर सकते हैं एक: @Neo4jTransactional

फिर, applicationContext.xml में, निम्नलिखित हैं (जहां neo4jdb अपने EmbeddedGraphDatabase है):

<bean id="neo4jTransactionManagerService" 
    class="org.neo4j.kernel.impl.transaction.SpringTransactionManager"> 
    <constructor-arg ref="neo4jdb" /> 
</bean> 
<bean id="neo4jUserTransactionService" class="org.neo4j.kernel.impl.transaction.UserTransactionImpl"> 
    <constructor-arg ref="neo4jdb" /> 
</bean> 

<bean id="neo4jTransactionManager" 
    class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManager" ref="neo4jTransactionManagerService" /> 
    <property name="userTransaction" ref="neo4jUserTransactionService" /> 
</bean> 

<tx:annotation-driven transaction-manager="neo4jTransactionManager" /> 

ध्यान रखें कि यदि आप किसी अन्य लेनदेन प्रबंधक का भी उपयोग करते हैं, तो आपको इस एनोटेशन-आधारित परिभाषा के लिए order="2" निर्दिष्ट करना होगा, और यह भी ध्यान में रखना होगा कि आपके पास दो चरण चरण नहीं होगा यदि आपके पास विधि जिसे एसक्यूएल और नियो 4j लेनदेन दोनों घोषित किया जाता है।

+4

पहले से ही @ नियो 4jTransactional है जो वास्तव में करता है। –

+3

और पहले से ही आपके द्वारा वर्णित तरीके से लेनदेन प्रबंधक सेट अप करता है। –

+2

धन्यवाद, मैंने एक अपडेट जोड़ा। पिछले संस्करणों में एनोटेशन नहीं था :) – Bozho

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