1. अवलोकन
इस ट्यूटोरियल में, हम सीखेंगे कि स्प्रिंग बूट में MongoDB के लिए अनुक्रमिक, ऑटो-जेनरेटेड फ़ील्ड को कैसे कार्यान्वित किया जाए।
जब हम स्प्रिंग बूट एप्लिकेशन के लिए डेटाबेस के रूप में MongoDB का उपयोग कर रहे हैं, तो हम @GeneratedValue का उपयोग नहीं कर सकते हैं हमारे मॉडल में एनोटेशन उपलब्ध नहीं है। इसलिए हमें उसी प्रभाव को उत्पन्न करने के लिए एक विधि की आवश्यकता है जो हमारे पास होगा यदि हम जेपीए और SQL डेटाबेस का उपयोग कर रहे हैं।
इस समस्या का सामान्य समाधान सरल है। हम एक संग्रह (तालिका) बनाएंगे जो अन्य संग्रहों के लिए उत्पन्न अनुक्रम को संग्रहीत करेगा। एक नया रिकॉर्ड बनाने के दौरान, हम इसका उपयोग अगला मान प्राप्त करने के लिए करेंगे।
2. निर्भरताएं
आइए हमारे pom.xml . में निम्नलिखित स्प्रिंग-बूट स्टार्टर्स जोड़ें :
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<versionId>2.2.2.RELEASE</versionId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<versionId>2.2.2.RELEASE</versionId>
</dependency>
</dependencies>
निर्भरता के लिए नवीनतम संस्करण स्प्रिंग-बूट-स्टार्टर-पैरेंट . द्वारा प्रबंधित किया जाता है ।
3. संग्रह
जैसा कि सिंहावलोकन में चर्चा की गई है, हम एक ऐसा संग्रह बनाएंगे जो अन्य संग्रहों के लिए स्वतः वृद्धि किए गए अनुक्रम को संग्रहीत करेगा। हम इस संग्रह को database_sequences कहेंगे. इसे मोंगो . का उपयोग करके बनाया जा सकता है खोल या मोंगोडीबी कम्पास। आइए एक संबंधित मॉडल वर्ग बनाएं:
@Document(collection = "database_sequences")
public class DatabaseSequence {
@Id
private String id;
private long seq;
//getters and setters omitted
}
आइए फिर एक उपयोगकर्ता बनाएं संग्रह, और एक संबंधित मॉडल ऑब्जेक्ट, जो हमारे सिस्टम का उपयोग करने वाले लोगों का विवरण संग्रहीत करेगा:
@Document(collection = "users")
public class User {
@Transient
public static final String SEQUENCE_NAME = "users_sequence";
@Id
private long id;
private String email;
//getters and setters omitted
}
उपयोगकर्ता . में ऊपर बनाया गया मॉडल, हमने एक स्थिर फ़ील्ड SEQUENCE_NAME, . जोड़ा है जो उपयोगकर्ताओं . के लिए स्वतः-वृद्धि अनुक्रम का एक अनूठा संदर्भ है संग्रह।
हम इसे @Transient . के साथ भी एनोटेट करते हैं इसे मॉडल के अन्य गुणों के साथ बने रहने से रोकने के लिए।
4. एक नया रिकॉर्ड बनाना
अब तक, हमने आवश्यक संग्रह और मॉडल बनाए हैं। अब, हम एक ऐसी सेवा बनाएंगे जो ऑटो-इन्क्रीमेंटेड मान जेनरेट करेगी जिसका उपयोग id के रूप में किया जा सकता है हमारी संस्थाओं के लिए।
आइए एक SequenceGeneratorService बनाएं जिसमें generateSequence() . है :
public long generateSequence(String seqName) {
DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),
new Update().inc("seq",1), options().returnNew(true).upsert(true),
DatabaseSequence.class);
return !Objects.isNull(counter) ? counter.getSeq() : 1;
}
अब, हम generateSequence() . का इस्तेमाल कर सकते हैं एक नया रिकॉर्ड बनाते समय:
User user = new User();
user.setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
user.setEmail("[email protected]");
userRepository.save(user);
सभी उपयोगकर्ताओं को सूचीबद्ध करने के लिए, हम UserRepository . का उपयोग करेंगे :
List<User> storedUsers = userRepository.findAll();
storedUsers.forEach(System.out::println);
जैसा कि अभी है, हमें हर बार अपने मॉडल का एक नया उदाहरण बनाते समय आईडी फ़ील्ड सेट करना होगा। हम स्प्रिंग डेटा MongoDB जीवनचक्र घटनाओं के लिए श्रोता बनाकर इस प्रक्रिया को दरकिनार कर सकते हैं।
ऐसा करने के लिए, हम एक UserModelListener बनाएंगे जो AbstractMongoEventListener
@Override
public void onBeforeConvert(BeforeConvertEvent<User> event) {
if (event.getSource().getId() < 1) {
event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
}
}
अब, हर बार जब हम एक नया उपयोगकर्ता, सहेजते हैं आईडी स्वचालित रूप से सेट हो जाएगा।