সংগ্রহের তালিকা

ওয়েল, আপনি দেখেছেন কিভাবে সহজ ধরনের ম্যাপ করতে হয়। এখন সময় এসেছে আরও আকর্ষণীয় প্রশ্নে যাওয়ার - কীভাবে বস্তুর সংগ্রহ ম্যাপ করা যায়।

এবং আমাদের 5 টি গ্রুপে বস্তু থাকতে পারে:

  • অ্যারে - বস্তুর একটি অ্যারে
  • তালিকা - বস্তুর তালিকা
  • সেট - বস্তুর সেট
  • মানচিত্র - বস্তুর একটি অভিধান
  • সংগ্রহ - বস্তুর একটি সংগ্রহ

এবং একটি সংগ্রহ ক্ষেত্র সহ একটি ক্লাসের উদাহরণ:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @magical-annotation
   public List messages;
}

তাহলে এই জাদুকরী টীকাটি কী যা আমাদের একটি ক্ষেত্র নয়, অনেকগুলি মান সঞ্চয় করতে দেবে?

এই টীকাটিকে @ElementCollection বলা হয় । উদাহরণ:

@Entity
@Table(name="user")
class User  {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   public List<String> messages;
}

এটি খুব সহজভাবে লেখা হয়, তবে এটি অ-তুচ্ছভাবে কাজ করে।

সহায়ক টেবিল

সত্তা শ্রেণীর সমস্ত ক্ষেত্র যেখানে অনেক উপাদান রয়েছে এবং @ElementCollection টীকা দিয়ে চিহ্নিত করা হয়েছে একটি বিশেষ সহায়ক টেবিলে ডাটাবেসে রয়েছে। যা আসলে যৌক্তিক।

এই টেবিলে দুটি আকারে ডেটা থাকতে পারে:

  • অর্ডার করা (তালিকা, মানচিত্র) তিনটি কলাম রয়েছে:
    • কী কলাম (বিদেশী কী) - মূল বস্তুর আইডির উল্লেখ।
    • সূচক কলাম - সংগ্রহে অবস্থান/সূচী।
    • উপাদান কলাম - মান।
  • ক্রমহীন (সেট) দুটি কলাম রয়েছে:
    • কী কলাম (বিদেশী কী) - মূল বস্তুর আইডির উল্লেখ।
    • উপাদান কলাম - মান।

আপনি একটি টীকা ব্যবহার করে স্পষ্টভাবে এই টেবিলের নাম সেট করতে পারেন:

@CollectionTable(name="table_name")

উদাহরণ:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message")
   public List<String> messages;
}

গুরুত্বপূর্ণ ! যদি @CollectionTable টীকাটি নির্দিষ্ট করা না থাকে, তাহলে হাইবারনেট ক্লাসের নাম এবং ক্ষেত্রের নামের উপর ভিত্তি করে টেবিলের নাম তৈরি করবে: ব্যবহারকারীর শ্রেণী এবং ক্ষেত্রবার্তাটেবিলের নাম দিন "ব্যবহারকারী_বার্তা"।

সংগ্রহ সংগ্রহ

তবে আসুন সহায়ক টেবিলের সৃষ্টিকে হাইবারনেটে না রেখে এটি নিজেরাই তৈরি করি। প্রথমে আমাদের দুটি কলাম সহ একটি টেবিল তৈরি করতে হবে:

CREATE TABLE user_message {
    user_id INT,
    message VARCHAR(255)
};

মনে রাখবেন যে এই টেবিলের নিজস্ব আইডি-কলাম নেই। এটি সহায়ক টেবিলের প্রধান বৈশিষ্ট্য। আপনি একটু পরে অন্যান্য ধরনের সহায়ক টেবিলের সাথে পরিচিত হবেন।

এখন আমাদের এই টেবিলটিকে আমাদের ফিল্ডে ম্যাপ করতে হবেবার্তাব্যবহারকারী ক্লাসে । এটি এই মত দেখাবে:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public Set<String> messages;
}

এখানে দুটি বিষয়ে মনোযোগ দেওয়া মূল্যবান।

প্রথমে, @Column(name = "message") টীকা দিয়ে নির্দিষ্ট করা বার্তা কলামটি user_message সহায়ক টেবিলে থাকে, ব্যবহারকারী টেবিলে নয়।

দ্বিতীয়ত, @JoinColumn(name = "user_id") টীকায় , আমরা user_id কলামের নাম উল্লেখ করেছি, যা ব্যবহারকারী টেবিলের আইডিকে নির্দেশ করে। এটি তাই যাতে হাইবারনেট তাদের সঠিকভাবে একত্রিত করতে জানে।

সংগ্রহ

আপনি যদি একটি অক্জিলিয়ারী টেবিলে একটি তালিকা বা অ্যারের আদেশকৃত উপাদান সংরক্ষণ করতে চান, তাহলে আপনার তিনটি কলাম সহ একটি টেবিলের প্রয়োজন:

CREATE TABLE user_message {
    user_id INT,
    index INT,
    message VARCHAR(255)
};

আপনি যদি কলামের নাম "সূচী" পছন্দ না করেন, বা আপনি এটি পরিবর্তন করতে না পারেন, আপনি ম্যাপিংয়ের সময় একটি ভিন্ন নাম উল্লেখ করতে পারেন। এটি করার জন্য, আপনাকে @Index টীকা ব্যবহার করতে হবে ।

উদাহরণ:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message",
       	indexes = { @Index(columnList = "list_index") }
       	joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public List<String> messages;
}

মানচিত্র সংগ্রহ

এবং অবশেষে, আপনি কেবল একটি সংগ্রহ নয়, একটি হ্যাশম্যাপ সঞ্চয় করতে চান এবং এটির জন্য আপনার একটি সহায়ক টেবিলে দুটি কলাম প্রয়োজন:

CREATE TABLE user_message {
    user_id INT,
    key VARCHAR(255),
    message VARCHAR(255)
};

একটি মানচিত্রের জন্য একটি কী নির্দিষ্ট করার জন্য, আপনার @MapKeyColumn টীকা প্রয়োজন ।

উদাহরণ:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @MapKeyColumn(name = "key")
   @Column(name = "message")
   public Map<String, String> messages;
}

আপনি অফিসিয়াল ডকুমেন্টেশনে আরও তথ্য পেতে পারেন ।