दिलचस्प पोस्ट
क्या है !! (नहीं) ऑपरेटर जावास्क्रिप्ट में? Asp.net 4.0 पंजीकृत नहीं किया गया है HH: mm: ss.SSS को मिलीसेकंड में कैसे परिवर्तित करें? सुरक्षित चलाने से एक ही कार्यक्रम के कई उदाहरणों को रोकने के लिए एक म्यूटक्स का उपयोग कर रहा है? मोबाइल डिवाइस पर प्रोग्रामिक स्क्रीन कैप्चर केवल एक तत्व का उपयोग करके बढ़ाया षट्कोण आकार का बटन UICollectionView एक सेल में छवि जोड़ने सर्वर पर क्लाएंट्सआई जावास्क्रिप्ट त्रुटियां लॉगिंग इकाई विशेषता मूल्य डाटाबेस बनाम सख्त संबंधपरक मॉडल ईकॉमर्स खुलने / बंद टैग और प्रदर्शन? अतिप्रवाह हो सकता है: लेआउट को छिपे हुए हैं? कैसे SQL सर्वर से एक पासवर्ड डिक्रिप्ट करने के लिए? त्रुटि: प्रोटोकॉल उपलब्ध नहीं है, डंपिंग बैक्रेस पुन: क्रम सूची तत्व – jQuery? सी # में मशीन का मैक पता पाने के लिए विश्वसनीय तरीका

JPA का उपयोग करके एक सूचकांक (गैर-अद्वितीय कुंजी) निर्दिष्ट करना

आप एक क्षेत्र को कैसे परिभाषित करते हैं, जैसे कि जेपीए एनोटेशन का प्रयोग करते हुए एक इंडेक्स के रूप में email । हमें email पर एक अनन्य कुंजी की आवश्यकता है क्योंकि प्रति दिन इस फ़ील्ड पर सचमुच लाखों प्रश्न हैं, और कुंजी के बिना थोड़ी धीमी गति से

 @Entity @Table(name="person", uniqueConstraints=@UniqueConstraint(columnNames={"code", "uid"})) public class Person { // Unique on code and uid public String code; public String uid; public String username; public String name; public String email; } 

मैंने एक हाइबरनेट विशिष्ट एनोटेशन देखा है लेकिन मैं विक्रेता विशिष्ट समाधानों से बचने की कोशिश कर रहा हूं क्योंकि हम अभी भी हाइबरनेट और डेटान्यूक्लियस के बीच तय कर रहे हैं।

अद्यतन करें:

जेपीए 2.1 के अनुसार, आप यह कर सकते हैं। देखें: एनोटेशन @ इंडेक्स को इस स्थान के लिए अनुमति नहीं है

Solutions Collecting From Web of "JPA का उपयोग करके एक सूचकांक (गैर-अद्वितीय कुंजी) निर्दिष्ट करना"

जहां तक ​​मुझे पता है, इंडेक्स को निर्दिष्ट करने के लिए कोई क्रॉस-जेपीए-प्रदाता तरीका नहीं है। हालांकि, आप हमेशा डेटाबेस में उन्हें सीधे हाथ से बना सकते हैं, अधिकांश डेटाबेस प्रश्नोत्तरी योजना के दौरान स्वचालित रूप से उनका चयन करेंगे।

जेपीए 2.1 के साथ आप इसे करने में सक्षम होना चाहिए।

 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Index; import javax.persistence.Table; @Entity @Table(name = "region", indexes = {@Index(name = "my_index_name", columnList="iso_code", unique = true), @Index(name = "my_index_name2", columnList="name", unique = false)}) public class Region{ @Column(name = "iso_code", nullable = false) private String isoCode; @Column(name = "name", nullable = false) private String name; } 

अपडेट : यदि आपको कभी भी दो या दो से अधिक स्तंभों के साथ बनाने और सूचकांक की आवश्यकता हो तो आप अल्पविराम का उपयोग कर सकते हैं। उदाहरण के लिए:

 @Entity @Table(name = "company__activity", indexes = {@Index(name = "i_company_activity", columnList = "activity_id,company_id")}) public class CompanyActivity{ 

JPA 2.1 (अंत में) अनुक्रमित और विदेशी कुंजी के लिए समर्थन जोड़ता है! विवरण के लिए इस ब्लॉग को देखें जेपीए 2.1 जावा ईई 7 का एक हिस्सा है, जो बाहर है।

यदि आप किनारे पर रहना पसंद करते हैं, तो आप अपने मेवेन रिपॉजिटरी (समूह आईआईडी: org.eclipse.persistence, artifactId: eclipselink, संस्करण: 2.5.0-SNAPSHOT) से एक्लिपसेलिक के लिए नवीनतम स्नैपशॉट प्राप्त कर सकते हैं। सिर्फ जेपीए एनोटेशन के लिए (जो 2.1 का समर्थन करने के बाद किसी भी प्रदाता के साथ काम करना चाहिए) artifactID का उपयोग करें: javax.preistence, संस्करण: 2.1.0-एसएनएपीएसएचओटी

मैं इसे एक ऐसी परियोजना के लिए उपयोग कर रहा हूं जो इसे रिलीज़ होने तक पूरा नहीं कर पाता, और मैंने कोई भयानक समस्या नहीं देखी है (हालांकि मैं इसके साथ कुछ भी जटिल नहीं कर रहा हूँ)।

अद्यतन (26 सितंबर 2013): आजकल रिलीज और रिलीज के उम्मीदवारों के संस्करण ईक्लिप्ससिंक केंद्रीय (मुख्य) रिपॉजिटरी में उपलब्ध हैं, इसलिए आपको अब मेवेन परियोजनाओं में ईक्लिपसेलिंक रिपॉजिटरी जोड़ना होगा नवीनतम रिलीज संस्करण 2.5.0 है लेकिन 2.5.1-आरसी 3 भी मौजूद है। 2.5.0 रिहाई के साथ मुद्दों की वजह से मैं 2.5.1 पर स्विच हो सकता हूं (मॉडल का काम नहीं करता)।

सूचकांक एनोटेशंस का एक अनोखा हाथ से उठाया संग्रह

= निर्दिष्टीकरण =

  • जेपीए 2.1+: javax.persistence.Index (या JSR-000338 देखें, पृष्ठ 450, आइटम 11.1.23)
    जेपीए @Index एनोटेशन का उपयोग केवल एक और एनोटेशन के हिस्से के रूप में किया जा सकता है जैसे कि @Table , @SecondaryTable , आदि।

     @Table(indexes = { @Index(...) }) 
  • javax.jdo.annotations.Index 2.1+: javax.jdo.annotations.Index

= ओआरएम फ्रेमवर्क =

  • ♥ हाइबरनेट ORM : org.hibernate.annotations.Index ;
  • ओपनजेपीए : org.apache.openjpa.persistence.jdbc.Index ;
  • ईक्लिप्स लिंक : org.eclipse.persistence.annotations.Index ;
  • डेटा न्यूक्लियस : org.datanucleus.api.jpa.annotations.Index ;
  • कार्बोनाडो ( गीथहब ) : com.amazon.carbonado.Index ;
  • EBean : com.avaje.ebean.annotation.Index ;
  • उज्मर्म : व्याख्या org.ujorm.orm.annot.Column , index और uniqueIndex गुण;
  • requery (GitHub) : एनोटेशन io.requery.Index ;
  • उजागर ( Kotlin एसक्यूएल पुस्तकालय): org.jetbrains.exposed.sql.Index , org.jetbrains.exposed.sql.Table # अनुक्रमणिका () । उदाहरण:

     object Persons : IdTable() { val code = varchar("code", 50).index() } 

= एंड्रॉइड के लिए ORM =

  • ♥ एक्टिव एंड्रॉइड : com.activeandroid.annotation.Column uniqueGroupsuniqueGroupsuniqueGroupsuniqueGroups index , index indexGroups , unique , और uniqueGroups गुण हैं;
  • ORMLite : एनोटेशन com.j256.ormlite.field.DatabaseField एक index संपत्ति है;
  • ग्रीनडाओ : de.greenrobot.daogenerator.Indexde.greenrobot.daogenerator.Index ;
  • ORMAN (GitHub) : org.orman.mapper.annotation.Index ;
  • ★ डीबीएफ्लो ( गीथहब ) : com.raizlabs.android.dbflow.sql.index.Index (उपयोग के उदाहरण );
  • अन्य

= अन्य (श्रेणीबद्ध करने के लिए मुश्किल) =

  • दायरे – आईओएस / एंड्रॉइड के लिए वैकल्पिक डीबी: एनोटेशन io.realm.annotations.Index ;
  • साम्राज्य-डीबी – जेडीबीसी पर आधारित एक हल्के और शक्तिशाली रिलेशनल डीबी अमूर्त परत। एनोटेशन के माध्यम से इसकी कोई स्कीमा परिभाषा नहीं है;
  • कोटलिन नोएसक्यूएल (गिटहब) – एक प्रतिक्रियाशील और प्रकार-सुरक्षित डीएसएल, नोएसक्यूएल डाटाबेस के साथ काम करने के लिए (पीओसी): ???

सिर्फ उनमें से एक के लिए जाओ।

मैं वास्तव में मानकीकृत तरीके से डेटाबेस अनुक्रमणिका को निर्दिष्ट करने में सक्षम होना चाहता हूं, लेकिन दुर्भाग्य से, यह जेपीए विनिर्देशन का हिस्सा नहीं है (हो सकता है कि डीपीडीए पीढ़ी समर्थन जेपीए विनिर्देश द्वारा जरूरी नहीं है, जो कि एक प्रकार का सड़क ब्लॉक है ऐसी सुविधा)

इसलिए आपको इसके लिए प्रदाता विशिष्ट विस्तार पर भरोसा करना होगा। सीतनिद्रा में होना, ओपनजैपा और ईक्लिप्स लिंक स्पष्ट रूप से ऐसे विस्तार की पेशकश करते हैं। मैं डेटा न्यूक्लियस के लिए पुष्टि नहीं कर सकता, लेकिन जब अनुक्रमणिका की परिभाषा JDO का हिस्सा है, मुझे लगता है कि यह करता है।

मुझे वाकई उम्मीद है कि सूचकांक समर्थन को विनिर्देश के अगले संस्करणों में मानकीकृत किया जाएगा और इस प्रकार किसी अन्य जवाब से असहमत हों, मुझे जेपीए में ऐसी कोई बात शामिल नहीं करने का कोई अच्छा कारण नहीं दिखता (विशेषकर जब से डेटाबेस हमेशा आपके नियंत्रण में नहीं होता है) इष्टतम डीडीएल पीढ़ी के समर्थन के लिए

वैसे, मैं सुझाव देता हूं कि जेपीए 2.0 स्पेस को डाउनलोड करना है।

जेपीए 2.1 में आपको निम्न कार्य करने की आवश्यकता है

 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Index; import javax.persistence.Table; @Entity(name="TEST_PERSON") @Table( name="TEST_PERSON", indexes = { @Index(name = "PERSON_INDX_0", columnList = "age"), @Index(name = "PERSON_INDX_1", columnList = "fName"), @Index(name = "PERSON_INDX_1", columnList = "sName") }) public class TestPerson { @Column(name = "age", nullable = false) private int age; @Column(name = "fName", nullable = false) private String firstName; @Column(name = "sName", nullable = false) private String secondName; @Id private long id; public TestPerson() { } } 

उपरोक्त उदाहरण में तालिका TEST_PERSON में 3 अनुक्रमित होंगे:

  • प्राथमिक कुंजी आईडी पर अद्वितीय अनुक्रमणिका

  • AGE पर सूचकांक

  • FNAME, SNAME पर मिश्रित अनुक्रमणिका

नोट 1: आप एक ही नाम के साथ दो इंडेक्स एनोटेशन वाले कंपाउंड इंडेक्स प्राप्त करते हैं

नोट 2: आप स्तंभ में कॉलम नाम निर्दिष्ट करें फ़ील्ड का नाम न दें

ओपनजेपीए आपको संपत्ति पर सूचकांक को परिभाषित करने के लिए गैर-मानक एनोटेशन निर्दिष्ट करने की अनुमति देता है।

विवरण यहाँ हैं

कॉलम पर एक सूचक को परिभाषित करने के लिए ईक्लिप्स लिंक ने एक एनोटेशन (उदाहरण के लिए, @ इंडेक्स ) प्रदान किया है इसका उपयोग का एक उदाहरण है उदाहरण का एक हिस्सा शामिल है …

प्रथम नाम और अंतिम नाम क्षेत्रों को एक साथ और व्यक्तिगत रूप से अनुक्रमित किया जाता है।

 @Entity @Index(name="EMP_NAME_INDEX", columnNames={"F_NAME","L_NAME"}) // Columns indexed together public class Employee{ @Id private long id; @Index // F_NAME column indexed @Column(name="F_NAME") private String firstName; @Index // F_NAME column indexed @Column(name="L_NAME") private String lastName; ... } 

अन्य जवाबों की गणना करने के लिए:

  • सीतनिद्रा में होना: org.hibernate.annotations.Index
  • ओपनजेपीए: org.apache.openjpa.persistence.jdbc.Index
  • एक्लिप्सलिंक: org.eclipse.persistence.annotations.Index

मैं सिर्फ उनमें से एक के लिए जाना होगा। यह जेपीए 2.1 के साथ किसी भी तरह से आ जाएगा और इस मामले में बदलने के लिए बहुत मुश्किल नहीं होना चाहिए कि आप वास्तव में अपने जेपीए प्रदाता को स्विच करना चाहते हैं।

जेपीए एनोटेशन का उपयोग करना संभव नहीं है। और यह समझ में आता है: जहां एक अनूठा संकल्पना स्पष्ट रूप से व्यावसायिक नियमों को परिभाषित करती है, एक सूचकांक तेजी से खोज करने का एक तरीका है। तो यह वास्तव में डीबीए द्वारा किया जाना चाहिए।

यह समाधान EclipseLink 2.5 के लिए है, और यह (परीक्षण) काम करता है:

 @Table(indexes = {@Index(columnList="mycol1"), @Index(columnList="mycol2")}) @Entity public class myclass implements Serializable{ private String mycol1; private String mycol2; } 

यह क्रमशः क्रम मानता है