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


98

आप किसी क्षेत्र को कैसे परिभाषित करते हैं, जैसे 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 के रूप में, आप ऐसा कर सकते हैं। देखें: इस स्थान के लिए एनोटेशन @ इंडेक्स अस्वीकृत है


6
मुझे बहुत अच्छा होगा यदि आप उत्तर को अपडेट कर सकते हैं ताकि लोगों को पता
चले

2
आप सबसे उत्कट उत्तर क्यों स्वीकार नहीं करते?
naXa

जवाबों:


206

जेपीए 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{

उनके जवाब के लिए एल्विन को धन्यवाद। (+1 वोट)। लेकिन मुझे कुछ चीजों की तलाश थी, मुझे आशा है कि यह उदाहरण आपके जीवन को आसान बना सकता है
बोरबाज

वास्तव में मैं क्या देख रहा था - एक सरल और साफ कोड छीन लिया - न केवल पूरी बात का वर्णन करना। धन्यवाद +1।
डोमिनिकनअर्जेर

2
@borjab - क्या आप मुझे एक संकेत दे सकते हैं जहाँ मैं @Indexएनोटेशन के भीतर एनोटेशन का उपयोग करने के लिए "आधिकारिक" उदाहरण या विनिर्देश पा सकता हूं @Table? मैंने JSR 338 पर खोज की है लेकिन मुझे यह वहां नहीं मिला। आपकी पोस्ट मेरे लिए बहुत उपयोगी है।
जिमहॉकिन्स

2
@Ulrich बिलकुल आधिकारिक दस्तावेज नहीं, बल्कि oracle ब्लॉग blogs.oracle.com/arungupta/entry/jpa_2_1_schema_generation
borjab

मुझे आश्चर्य है, अगर मेरे पास @ कॉलम (अद्वितीय = सत्य) वाला कॉलम है, तो क्या यह इंडेक्स सूची में विलय हो जाता है (क्योंकि अद्वितीय भी एक इंडेक्स है)?
wkrueger

34

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

= विनिर्देशों =

  • जेपीए 2.1+: javax.persistence.Index(या देखने JSR-000,338 । पीडीएफ, पी 452, आइटम 11.1.23)
    जेपीए @Indexएनोटेशन केवल की तरह एक और एनोटेशन के हिस्से के रूप में इस्तेमाल किया जा सकता है @Table, @SecondaryTable, आदि .:

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

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

= Android के लिए ORM =

= अन्य (वर्गीकृत करने के लिए मुश्किल) =

  • क्षेत्र - iOS / Android के लिए वैकल्पिक DB: एनोटेशन io.realm.annotations.Index;
  • एम्पायर-डीबी - जेडडीबीसी पर आधारित एक हल्के अभी तक शक्तिशाली रिलेशनल डीबी अमूर्त परत। एनोटेशन के माध्यम से इसकी कोई स्कीमा परिभाषा नहीं है;
  • Kotlin NoSQL (GitHub) - NoSQL डेटाबेस (PoC) के साथ काम करने के लिए एक प्रतिक्रियाशील और प्रकार-सुरक्षित DSL: ???
  • स्लीक - स्काला के लिए रिएक्टिव फंक्शनल रिलेशनल मैपिंग। एनोटेशन के माध्यम से इसकी कोई स्कीमा परिभाषा नहीं है।

बस उनमें से एक के लिए जाओ।


31

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

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

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

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


9

जेपीए 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: आप एक ही नाम के साथ दो @Index एनोटेशन होने से कंपाउंड इंडेक्स प्राप्त करते हैं

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


5

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

तो आपको उसके लिए एक प्रदाता विशिष्ट एक्सटेंशन पर निर्भर रहना होगा। हाइबरनेट, OpenJPA और EclipseLink स्पष्ट रूप से इस तरह के विस्तार की पेशकश करते हैं। मैं DataNucleus के लिए पुष्टि नहीं कर सकता, लेकिन चूंकि अनुक्रमित परिभाषा JDO का हिस्सा है, मुझे लगता है कि यह करता है।

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

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


4

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


2
योग्य, आपको लगता है कि आपके पास डीबीए का काम है डीबीए: (:
याकूब

3
मुझे यह थोड़ा अजीब लगता है कि "अनोखा" करने का एक तरीका है, लेकिन एक इंडेक्स करने का तरीका नहीं है।
जैकब

7
@ जेकॉब - वैसे आवेदन स्तर पर यह जानना महत्वपूर्ण है कि क्या कुछ क्षेत्र अद्वितीय होगा या नहीं। दूसरी ओर, अनुक्रमित, डीबी पहुंच के अनुकूलन के प्रयोजनों के लिए हैं। यह जानने के लिए कोई आवश्यकता नहीं है (जहां तक ​​मैं देखता हूं) यह जानने के लिए कि क्या कोई स्तंभ जावा परत पर एक सूचकांक है या नहीं। जैसा कि आपने कहा, डीबीए एक सूचकांक स्थापित कर सकता है अगर ऐसा लगता है कि किसी विशेष स्तंभ से लाभ होगा।
जावा ड्रिंकर

1
@ जैकब, कोई इंडेक्स सुपरपोर्ट नहीं है क्योंकि यह केवल एक अनुकूलन है (आमतौर पर एक महत्वपूर्ण, लेकिन अभी भी एक अनुकूलन)। OTOH यदि कोई फ़ील्ड (या फ़ील्ड्स का सेट) अद्वितीय है या नहीं, मॉडल पर निर्भर करता है, और शुद्धता को प्रभावित करेगा। इसके अलावा, पूरी तरह से 200USD / Hr DBA के लिए कोई आवश्यकता नहीं है, कुछ सरल सूचकांक सृजन बयान आमतौर पर पर्याप्त होते हैं।
Tassos Bassoukos

8
जेपीए 2.1 निर्दिष्ट करता हैjavax.persistence.Index
लुकास ईडर

2

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

FirstName और lastName फ़ील्ड्स को एक साथ और व्यक्तिगत रूप से अनुक्रमित किया जाता है।

@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                      // L_NAME column indexed
    @Column(name="L_NAME")
    private String lastName;
    ...
}

1

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

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


1

अन्य उत्तरों का योग करने के लिए:

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


0

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


0

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

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

यह आरोही क्रम मानता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.