मैंने एक नई परियोजना के लिए Mybatis को आजमाने और उपयोग करने का निर्णय लिया है। मैं एसक्यूएल के साथ सौभाग्य से परिचित हूं, और हाल ही में मुझे हाइबरनेट के साथ कुछ बुरे अनुभव हुए हैं इसलिए मैं डीएओ के लिए एक और निम्न स्तर के दृष्टिकोण की तलाश में हूं।माइबेटिस के साथ संग्रह सहेजना/अद्यतन करना, सामान्य अभ्यास क्या है?
एक चीज़ को छोड़कर काफी अच्छा लगता है, और यह संग्रहों को संभालने वाला है।
मेरे पास दो पीओजेओ, समूह और उपयोगकर्ता हैं, जो कई से अधिक हैं। मैंने एक डिज़ाइन दर्शन पर निर्णय लिया है कि एक पीओजेओ जिसमें संग्रह है, केवल सहेजे जाने पर तालिकाओं के बीच एम-एम संबंध अपडेट करना चाहिए। इसलिए, उदाहरण के लिए, जब मैं एक समूह ऑब्जेक्ट को सहेजता हूं जिसमें उपयोगकर्ताओं का संग्रह होता है, तो डिज़ाइन दर्शन यह बताता है कि उपयोगकर्ताओं को पहले से ही सहेजा जाना चाहिए, और मुझे केवल डेटाबेस में समूह और समूह_यूज़र संबंध को सहेजना होगा।
हां, इंटरफ़ेस में saveGroup समारोह के लिए, मैं mybatis के लिए इस XML मैपिंग कर दिया है:
<insert id="saveGroup" keyColumn="id"
parameterType="se.myapp.domain.Group">
<choose>
<when test="id == null">
INSERT INTO myapp_group (name, description)
VALUES
(#{username}, #{password});
</when>
<otherwise>
UPDATE myapp_group set name=#{name}, description=#{description}
where id=#{id};
</otherwise>
</choose>
<if test="users != null">
create temporary table tmpnewgroups (group_id integer, user_id integer);
insert into tmpnewgroups (group_id, user_id) values (
<foreach collection="users" item="user" open="" close="" separator="),()">
#{id},#{user.id}
</foreach>
);
insert into myapp_user_group(group_id, user_id)
select tmp.group_id, tmp.user_id
from tmpnewgroups tmp
left outer join myapp_user_group ug
on ug.group_id = tmp.group_id and ug.user_id = tmp.user_id
where ug.group_id is null;
delete from myapp_user_group
where group_id = #{id} and user_id not in (select user_id from tmpnewgroups);
</if>
</insert>
के रूप में इरादा यह कार्य करता है (सम्मिलित/समूह अपडेट हो जाता है, संबंधों के रूप में उपयोगकर्ताओं के संग्रह की बचत होती है डेटाबेस में)। लेकिन मुझे सच में नहीं लगता कि यह सबसे अच्छा अभ्यास है। आवेदन किया जाता है ताकि यदि आवश्यक हो तो मैं हाइबरनेट पर स्विच कर सकता हूं, इसलिए संग्रह को सहेजने के लिए तर्क डेटाबेस स्तर में अधिमानतः होना चाहिए। क्या माइबेटिस में कुछ "जादू" है कि मुझे इस बात से अवगत नहीं है कि इस तरह के संचालन को सुव्यवस्थित कर सकते हैं?
इस पर सुधार करने के तरीके पर कोई विचार? या क्या मुझे एप्लिकेशन डिज़ाइन पर पुनर्विचार करना चाहिए और मॉडल में संग्रहों को संभालना चाहिए?
कई लोगों का वर्णन करने के लिए ' 'और इसके' ' का उपयोग करने में कोई समस्या थी: कई रिश्ते? –
Gus
अच्छी तरह से परिणाम परिणाम डेटा प्राप्त करने के लिए डेटा प्राप्त करने के लिए हैं। संग्रह प्राप्त करना कोई समस्या नहीं है, यह उन्हें बचा रहा है कि मुझे बोझिल लगता है। – Dytut
क्या आपने [MyBatis जेनरेटर] (https://code.google.com/p/mybatis/wiki/Generator) का उपयोग करने पर देखा है? यह आपके लिए हाथ से कोडित एसक्यूएल की एक टन बचाए जाने के लिए मूल सीआरयूडी संचालन उत्पन्न करेगा, इसलिए आपको केवल जटिल जटिलताओं को लिखना होगा, आदि। आप अपने डीएओ में जेनरेट कोड का उपयोग कर सकते हैं और आपके द्वारा चुने गए चयन तर्क को बहुत से स्थानांतरित कर सकते हैं आपका एक्सएमएल डीएओ में। – clav