জেপিএ ব্যবহার করে একটি সূচক (অ-স্বতন্ত্র কী) নির্দিষ্ট করা


102

আপনি কোনও ক্ষেত্রকে কীভাবে সংজ্ঞায়িত করেন, যেমন 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;
}

আমি একটি হাইবারনেট নির্দিষ্ট টীকাটি দেখেছি তবে আমি বিক্রেতার নির্দিষ্ট সমাধানগুলি এড়াতে চাইছি কারণ আমরা এখনও হাইবারনেট এবং ডেটানুক্লিয়াসের মধ্যে সিদ্ধান্ত নিচ্ছি।

হালনাগাদ:

JPA 2.1 হিসাবে, আপনি এটি করতে পারেন। দেখুন: টেক্সট @ সূচকটি এই অবস্থানের জন্য অনুমোদিত নয়


6
আমি উত্তরটি আপডেট করতে পারলে আমি দুর্দান্ত হব যাতে লোকেরা জানতে পারে যে জেপিএ ২.১ এর সাথে এটি করার একটি উপায় আছে
বোরজব

4
আপনি কেন সর্বাধিক উত্সাহিত উত্তর গ্রহণ করবেন না?
নেক্সা

উত্তর:


215

JPA 2.1 এর সাথে আপনার এটি করা উচিত able

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
ডোমিনিক অ্যাঞ্জেরার

4
@ জঞ্জাব - আপনি দয়া করে আমাকে এমন একটি ইঙ্গিত দিতে পারেন যেখানে আমি টীকাটির @Indexমধ্যে টীকাটি ব্যবহারের জন্য একটি "অফিসিয়াল" উদাহরণ বা স্পেসিফিকেশন পেতে @Tableপারি? আমি জেএসআর 338 এ অনুসন্ধান করেছি কিন্তু আমি এটি সেখানে পাই নি। আপনার পোস্টটি আমার জন্য খুব দরকারী।
জিমহকিন্স

4
@ অলিরিচ সরকারী দস্তাবেজগুলি ঠিক নয় তবে ওরাকল ব্লগ ব্লগস.আরাকল.com
আরুনগুপ্ত

আমি অবাক হই, যদি আমার @ কলামের (অনন্য = সত্য) কলাম থাকে তবে এটি কি সূচক তালিকায় একীভূত হবে (যেহেতু অনন্যটিও একটি সূচক)?
wkrueger

36

সূচক টীকাগুলির একটি অনন্য হাতে নেওয়া সংগ্রহ

= বিশেষ উল্লেখ =

  • জেপিএ 2.1 + -এর: javax.persistence.Index(অথবা দেখতে JSR-000338 । পিডিএফ, পি 452, আইটেম 11.1.23)
    JPA @Indexটীকা শুধুমাত্র মত অন্য টীকা অংশ হিসেবে ব্যবহার করা যেতে পারে @Table, @SecondaryTableইত্যাদি .:

    @Table(indexes = { @Index(...) })
    
  • জেডিও ২.১+:javax.jdo.annotations.Index

= ORM ফ্রেমওয়ার্ক = works

= অ্যান্ড্রয়েডের জন্য ORM =

= অন্যান্য (শ্রেণিবদ্ধ করা কঠিন) =

  • রাজ্য - আইওএস / অ্যান্ড্রয়েডের জন্য বিকল্প ডিবি: টিকাio.realm.annotations.Index ;
  • এম্পায়ার-ডিবি - জেডিবিসি ভিত্তিক হালকা হলেও শক্তিশালী রিলেশনাল ডিবি অ্যাবস্ট্রাকশন স্তর raction টীকাগুলির মাধ্যমে এর কোনও স্কিমা সংজ্ঞা নেই;
  • কোটলিন নোএসকিউএল (গিটহাব) - নোএসকিউএল ডাটাবেসগুলির (পিওসি) সাথে কাজ করার জন্য একটি প্রতিক্রিয়াশীল এবং টাইপ-নিরাপদ ডিএসএল: ???
  • বাক্পটুতাপূর্ণ - স্কালার জন্য কার্যকরী সম্পর্কিত সম্পর্কিত ম্যাপিং। টীকাগুলির মাধ্যমে এর কোনও স্কিমা সংজ্ঞা নেই।

তাদের মধ্যে কেবল একটির জন্য যান।


31

জেপিএ ২.১ (শেষ অবধি) সূচি এবং বিদেশী কীগুলির জন্য সমর্থন যুক্ত করে! বিশদ জন্য এই ব্লগ দেখুন । জেপিএ ২.১ জাভা ইই part এর একটি অংশ, যা বাইরে।

আপনি যদি প্রান্তে বসবাস করতে চান তবে আপনি তাদের মভেন রিপোজিটরির (গ্রুপআইড: org.eclipse.persistance, আর্টিফ্যাক্ট আইডি: গ্রিপসেলিংক, সংস্করণ: 2.5.0-এসএনএপিএসএইচটি) থেকে এক্স্লিপসেলিংকের সর্বশেষ স্ন্যাপশটটি পেতে পারেন । কেবল জেপিএ টীকাগুলির জন্য (যা কোনও সরবরাহকারীর সাথে তারা 2.1 সমর্থন করার পরে কাজ করবে) আর্টিফ্যাক্টআইডি ব্যবহার করুন: জাভ্যাক্স.পার্সিস্টেশন, সংস্করণ: ২.১.০-এসএনএপশট।

আমি এটি এমন একটি প্রকল্পের জন্য ব্যবহার করছি যা প্রকাশের পরে শেষ হবে না এবং আমি কোনও ভয়াবহ সমস্যা লক্ষ্য করিনি (যদিও আমি এটির সাথে খুব জটিল কিছু করছি না)।

আপডেট (২ Sep সেপ্টেম্বর ২০১৩): আজকাল কেন্দ্রের (মূল) সংগ্রহস্থলে ইক্লিপসেলিংকের প্রার্থী সংস্করণগুলি প্রকাশ এবং প্রকাশ করা হয়, সুতরাং আপনাকে আর মাভেন প্রকল্পগুলিতে গ্রহপরিবর্তনীয় ভাণ্ডার যুক্ত করতে হবে না। সর্বশেষ প্রকাশের সংস্করণটি 2.5.0 তবে 2.5.1-আরসি 3 উপস্থিত রয়েছে। 2.5.0 রিলিজ (মডেলজেন স্টাফ কাজ করে না) সংক্রান্ত সমস্যার কারণে আমি 2.5.1 এএসএপ এ স্যুইচ করব।


9

জেপিএ ২.১ এ আপনাকে নিম্নলিখিতগুলি করা দরকার

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 টি সূচক থাকবে:

  • প্রাথমিক কী আইডিতে অনন্য সূচক

  • এজিই-তে সূচক

  • FNAME, SNAME- তে যৌগিক সূচক

দ্রষ্টব্য 1: আপনি একই নামের সাথে দুটি @ সূচক টীকাগুলি দিয়ে যৌগিক সূচকটি পান

দ্রষ্টব্য 2: আপনি কলামে কলামের নাম উল্লেখ করেছেন ক্ষেত্রের নাম নয় ist


5

আমি সত্যই একটি মানসম্মত উপায়ে ডাটাবেস সূচকগুলি নির্দিষ্ট করতে সক্ষম হতে চাই তবে দুঃখের বিষয়, এটি জেপিএ নির্দিষ্টকরণের অংশ নয় (সম্ভবত কারণ জেপিএ স্পেসিফিকেশন দ্বারা ডিডিএল জেনারেশন সমর্থন প্রয়োজন হয় না, যা এক ধরণের রোড ব্লক যেমন একটি বৈশিষ্ট্য)।

সুতরাং আপনাকে তার জন্য কোনও সরবরাহকারীর নির্দিষ্ট এক্সটেনশনের উপর নির্ভর করতে হবে। হাইবারনেট, ওপেনজেপিএ এবং ইক্লিপস লিঙ্ক স্পষ্টভাবে এ জাতীয় একটি এক্সটেনশন দেয়। আমি ডেটা নিউক্লিয়াসের জন্য নিশ্চিত করতে পারি না তবে সূচী সংজ্ঞা যেহেতু জেডিওর একটি অংশ তাই এটি অনুমান করে।

আমি সত্যিই আশা করি সূচক সমর্থন স্পেসিফিকেশনের পরবর্তী সংস্করণগুলিতে মানক হয়ে উঠবে এবং এইভাবে অন্য উত্তরগুলির সাথে একমত হবে না, জেপিএতে এই জাতীয় জিনিস অন্তর্ভুক্ত না করার কোনও ভাল কারণ আমি দেখছি না (বিশেষত যেহেতু ডাটাবেস সবসময় আপনার নিয়ন্ত্রণে থাকে না) অনুকূল ডিডিএল জেনারেশন সহায়তার জন্য।

যাইহোক, আমি JPA 2.0 স্পেসটি ডাউনলোড করার পরামর্শ দিই।


4

আমি যতদূর জানি, সূচকগুলি নির্দিষ্ট করার জন্য কোনও ক্রস-জেপিএ-সরবরাহকারী উপায় নেই। যাইহোক, আপনি সর্বদা সরাসরি ডাটাবেসে তাদের হাতে তৈরি করতে পারেন, বেশিরভাগ ডাটাবেসগুলি কোয়েরি পরিকল্পনার সময় এগুলি স্বয়ংক্রিয়ভাবে গ্রহণ করবে।


4
হ্যাঁ, আপনি ধরে নিচ্ছেন যে ডিবিএ'র কাজ ডিবিএর কাজ করে (:
জয়

4
আমি এটি কিছুটা বিজোড় বলে মনে করি যে "অনন্য" করার একটি উপায় আছে তবে কোনও সূচক করার উপায় নেই।
জে

7
@ জ্যাকব - আবেদনের স্তরে কিছু ক্ষেত্রটি অনন্য হবে কিনা তা জেনে রাখা ভাল। অন্যদিকে সূচিগুলি ডিবি অ্যাক্সেসকে অনুকূল করে তোলার উদ্দেশ্যে। জাভা স্তরে কোনও কলাম একটি সূচক কিনা তা জানার দরকার নেই (যতদূর আমি দেখতে পাচ্ছি)। যেমনটি আপনি বলেছেন, ডিবিএ একটি সূচক সেট আপ করতে পারে যদি মনে হয় যে কোনও নির্দিষ্ট কলাম এটির দ্বারা উপকৃত হবে।
জাভা ড্রিংকার

4
@ জ্যাকব, কোনও সূচী সাপোর্ট নেই কারণ এটি কেবলমাত্র একটি অপ্টিমাইজেশন (সাধারণত একটি গুরুত্বপূর্ণ, তবে একটি অপ্টিমাইজেশন)। ওটিওএইচ যদি কোনও ক্ষেত্র (বা ক্ষেত্রের সেট) অনন্য বা মডেলের উপর নির্ভর করে না, এবং নির্ভুলতার উপর প্রভাব ফেলবে। এছাড়াও, একটি পূর্ণাঙ্গ 200USD / HR ডিবিএর দরকার নেই, কিছু সাধারণ সূচি তৈরির বিবৃতি সাধারণত পর্যাপ্ত।
তাসসোস বাসুকোস

8
জেপিএ 2.1 নির্দিষ্ট করেjavax.persistence.Index
লুকাশ এডার

2

EclipseLink কলামগুলিতে একটি সূচককে সংজ্ঞায়িত করতে একটি টিকা (যেমন @ ইন্ডেক্স ) সরবরাহ করেছে। একটা হল উদাহরণস্বরূপ তার ব্যবহার করুন। উদাহরণের অংশটি অন্তর্ভুক্ত করা হয়েছে ...

ফার্স্টনাম এবং লাস্টনাম ক্ষেত্রগুলি একত্রে এবং স্বতন্ত্রভাবে ইনডেক্স করা হয়।

@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

ওপেনজেপিএ আপনাকে সম্পত্তির সূচকটি সংজ্ঞায়িত করতে অ-মানক টীকা নির্দিষ্ট করতে দেয়।

বিশদ এখানে


1

অন্যান্য উত্তরগুলি সংক্ষিপ্ত করতে:

আমি কেবল তাদের একটিতে যেতে চাই। এটি যাইহোক JPA 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;
}

এটি আরোহী আদেশ অনুমান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.