2009-11-20 12 views
14

मैं iBatis/Java और Postgres 8.3 का उपयोग कर रहा हूं। जब मैं ibatis में कोई सम्मिलित करता हूं तो मुझे आईडी वापस लौटने की आवश्यकता होती है।
मैं मेरे सवाल का वर्णन करने के लिए निम्न तालिका का उपयोग करें:
CREATE TABLE sometable (id serial NOT NULL, somefield VARCHAR(10));
अनुक्रम sometable_id_seq बयान बनाने चलाकर ऑटोजनरेटेड हो जाता है।इबेटिस (वापसी कीवर्ड के साथ) के साथ सम्मिलन पर आईडी कैसे लौटाएं

पल मैं निम्नलिखित एसक्यूएल मानचित्र का उपयोग पर:

<insert id="insertValue" parameterClass="string" > 
INSERT INTO sometable (somefield) VALUES (#value#); 
<selectKey keyProperty="id" resultClass="int"> 
    SELECT last_value AS id FROM sometable_id_seq 
</selectKey> 
</insert> 

ऐसा लगता है इस नव डाला आईडी पुन: प्राप्त करने के ibatis तरीका है। इबैटिस पहले आईएनएसईआरटी स्टेटमेंट चलाता है और बाद में यह अंतिम आईडी के अनुक्रम से पूछता है।
मुझे संदेह है कि यह कई समवर्ती आवेषणों के साथ काम करेगा। लेकिन
INSERT INTO sometable (somefield) VALUES (#value#) RETURNING id;

जब मैं एक <insert> sqlmap ibatis भीतर इसका इस्तेमाल करने के लिए आईडी वापस नहीं करता है कोशिश: (discussed in this question)

मैं ibatis के साथ निम्न कथन का उपयोग करना चाहते हैं। ऐसा लगता है कि <selectKey> टैग की आवश्यकता है।

कैसे मैं ibatis साथ उपरोक्त कथन का उपयोग कर सकते हैं:

तो यहाँ

सवाल आता है?

उत्तर

15

<selectKey> तत्व <insert> तत्व का एक बच्चा है और उसकी सामग्री मुख्य INSERT बयान से पहले निष्पादित किया जाता है। आप दो दृष्टिकोणों का उपयोग कर सकते हैं।

कुंजी लायें के बाद आप रिकॉर्ड

यह दृष्टिकोण अपने ड्राइवर पर निर्भर करता है काम करता है डाला है। थ्रेडिंग इस में एक समस्या हो सकती है।

रिकॉर्ड

यह दृष्टिकोण सूत्रण समस्याओं से बचा जाता है लेकिन अधिक काम है डालने से पहले कुंजी ला रहा है। उदाहरण:

<insert id="insert"> 
    <selectKey keyProperty="myId" 
      resultClass="int"> 
    SELECT nextVal('my_id_seq') 
    </selectKey> 
    INSERT INTO my 
    (myId, foo, bar) 
    VALUES 
    (#myId#, #foo#, #bar#) 
</insert> 

जावा तरफ आप तो

Integer insertedId = (Integer) sqlMap.insert("insert", params) 

यह आपको my_id_seq अनुक्रम से चयनित कुंजी देना चाहिए कर सकते हैं।

+0

यह समाधान मेरी सहमति चिंता को हल करता है। यह केवल प्रश्न छोड़ देता है अगर ibatis इंसर्ट के साथ काम कर सकता है .. रिटर्न .. वाक्यविन्यास। – Christoph

9

यहाँ सरल उदाहरण है:

<statement id="addObject" 
     parameterClass="test.Object" 
     resultClass="int"> 
     INSERT INTO objects(expression, meta, title, 
     usersid) 
     VALUES (#expression#, #meta#, #title#, #usersId#) 
     RETURNING id 
</statement> 

और जावा कोड में:

Integer id = (Integer) executor.queryForObject("addObject", object); 
object.setId(id); 

इस तरह अधिक उपयोग की तुलना में बेहतर:

  1. यह आसान है;
  2. इसने अनुक्रम नाम (आमतौर पर पोस्टग्रेस्क्ल डेवलपर्स से छिपा हुआ) जानने का अनुरोध नहीं किया है।
+0

वह उत्तर होगा जो मैं खोज रहा था ... लेकिन यह काम नहीं कर रहा है: executer.queryForObject का उपयोग करते समय आईडी वापस आती है, लेकिन कुछ भी डाला नहीं जाता है, और जब मैं executer.insert का उपयोग करता हूं तो पंक्ति डाली जाती है, लेकिन शून्य है – Christoph

+0

लौटा यह बहुत अजीब है, क्योंकि मैं अपना वर्क कोड कॉपी और पेस्ट करता हूं। मुझे यह भी समझ में नहीं आता - आप नए रिकॉर्ड को जोड़ने के बिना आईडी कैसे प्राप्त कर सकते हैं? iBatis SQL लॉग में आप क्या देखते हैं? – leonidv

+2

लगता है जैसे आप में से एक ऑटो-प्रतिबद्ध सक्षम है, और दूसरा नहीं है। – inanutshellus