ম্যাপিম enum

আমরা ইতিমধ্যেই খুঁজে বের করেছি কিভাবে আদিম ডেটা টাইপ ম্যাপ করতে হয়: আমরা @Column টীকা এবং @Type টীকা ব্যবহার করি । কিন্তু সব ক্ষেত্রে এই টীকা দ্বারা আচ্ছাদিত করা যাবে না. এবং সবচেয়ে সাধারণ ক্ষেত্রে হল enum

Java enum অবজেক্ট দুটি উপায়ে ডাটাবেসে সংরক্ষণ করা যেতে পারে:

  • একটি সংখ্যা হিসাবে
  • একটি স্ট্রিং হিসাবে

আসুন একটি ছোট উদাহরণ লিখি যেখানে ব্যবহারকারীর একটি প্রিয় রঙ থাকবে, যা enum ব্যবহার করে সেট করা হয়েছে।


enum Color {
   RED,
   ORANGE,
   YELLOW,
   GREEN,
   BLUE,
   VIOLET
}

এবং ব্যবহারকারী ক্লাসে একটি রঙ ক্ষেত্র যোগ করুন :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

আমরা যদি হাইবারনেট চাই রঙের ধরনটিকে সংখ্যা হিসাবে বেসে সংরক্ষণ করতে , তাহলে আমাদের ক্ষেত্রটি প্রয়োজনপ্রিয় রঙটীকা যোগ করুন:


@Enumerated(EnumType.ORDINAL)

যদি আমরা মানগুলিকে স্ট্রিং হিসাবে সংরক্ষণ করতে চাই , তাহলে আমাদের একটি টীকা যোগ করতে হবে:


@Enumerated(EnumType.STRING)

উদাহরণ:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Enumerated(EnumType.ORDINAL) //value will be saved to the base as a number
   @Column(name="favorite_color")
   public Color favoriteColor;
 
   @Column(name="created_date")
   public Date createdDate;
}

ম্যাপিম বুলিয়ান

দ্বিতীয় দরকারী দৃশ্য বুলিয়ান টাইপ ম্যাপিং। এটি ঐতিহাসিকভাবে ঘটেছিল যে বুলিয়ানের জন্য SQL এর নিজস্ব ডেটা টাইপ নেই এবং এর পরিবর্তে সেখানে কিছু ব্যবহার করা হয়।

তিনটি সবচেয়ে সাধারণ বিকল্প হল:

  • 1 বা 0
  • 'এফ' বা 'টি'
  • 'Y' বা 'N'

সাধারণভাবে, আপনি যদি আপনার বেস ডিজাইন করতে যাচ্ছেন, তাহলে এখনই বিআইটি টাইপ লিখলে ভালো হয়। ওয়েল, এটির জন্য সম্পূর্ণ ম্যাপিং এই মত দেখাবে:


	@Column(name = "is_correct", columnDefinition = "BIT")
	@Type(type = "org.hibernate.type.NumericBooleanType")
    private Boolean isCorrect;

ঠিক আছে, আপনি যদি ডাটাবেস ডিজাইন না করেন, তাহলে উপরের টেবিলটি দেখুন এবং আপনার প্রয়োজনীয় প্রকারগুলিকে কীভাবে সঠিকভাবে ম্যাপ করবেন সে সম্পর্কে চিন্তা করুন।

গণনা করা ক্ষেত্র

কখনও কখনও একটি এন্টিটি ক্লাসের ক্ষেত্রের সংখ্যা এবং একটি টেবিলের কলামের সংখ্যা মেলে না। এই জন্য বিভিন্ন কারণে হতে পারে।

সবচেয়ে সাধারণ হল যখন আমাদের এন্টিটি ক্লাসে এমন কিছু ক্ষেত্র থাকে যা আমরা ডাটাবেসে সংরক্ষণ করতে চাই না । এর সাথে সবকিছু পরিষ্কার - শুধু এই ধরনের একটি ক্ষেত্রে @Transient টীকা যোগ করুন এবং ডাটাবেসের সাথে কাজ করার সময় হাইবারনেট এটি উপেক্ষা করবে।

উদাহরণ:


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Transient
           	public Integer total;
}

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


@Entity(name = "Square")
public class Square {
           	@Id
           	public Long id;
 
           	public Integer width;
 
           	public Integer height;
 
           	@Formula(value = " width * height ")
          	public Integer total;
}

এই ধরনের একটি ক্ষেত্র ডাটাবেসে সংরক্ষণ করা হবে না, এবং যখন বস্তুটি ডাটাবেস থেকে পড়া হবে, তখন সূত্র দ্বারা গণনা করা মানটি এতে লেখা হবে।

এসকিউএল ক্যোয়ারী এই মত কিছু দেখতে হবে:

 SELECT id, width, height, (width* height) AS total FROM Square;

@এম্বেডেড

আরেকটি দরকারী টীকা হল @Embedded । এটি আপনাকে চাইল্ড অবজেক্টের ক্ষেত্রগুলিকে এন্টিটি ক্লাসের ক্ষেত্র হিসাবে বিবেচনা করতে দেয়।

ধরা যাক আপনার একটি ব্যবহারকারী শ্রেণী আছে এবং আপনি এটিতে একটি ঠিকানা যোগ করার সিদ্ধান্ত নেন:


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
    public Integer id;
 
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
 
   @Column(name="created_date")
    public Date createdDate;
}

সবকিছু ঠিক আছে বলে মনে হচ্ছে, তবে জাভার দৃষ্টিকোণ থেকে, ঠিকানাটিকে একটি পৃথক ক্লাসে রাখা যৌক্তিক হবে। ঠিকানা এখনও একটি পৃথক সত্তা. কিন্তু এই সমস্ত তথ্য ব্যবহারকারী টেবিলের ডাটাবেসে সংরক্ষণ করা হলে কিভাবে এটি করবেন?

@Embedded টীকা আমাদের সাহায্য করবে । প্রথমে, আমরা UserAddress ক্লাস তৈরি করব এবং ব্যবহারকারীর ঠিকানার সমস্ত তথ্য এতে রাখব:


@Embeddable
class UserAddress
{
   @Column(name="user_address_country")
   public String country;
   @Column(name="user_address_city")
   public String city;
   @Column(name="user_address_street")
   public String street;
   @Column(name="user_address_home")
   public String home;
}

এবং তারপর আমরা আমাদের ব্যবহারকারী ক্লাসে এই শ্রেণীর একটি ক্ষেত্র ব্যবহার করি :


@Entity
@Table(name="user")
class User
{
   @Column(name="id")
   public Integer id;
 
   @Embedded
   public UserAddress address;
 
   @Column(name="created_date")
   public Date createdDate;
}

@Embedded টীকাটির জন্য ধন্যবাদ, অবজেক্টটি সংরক্ষণ করার সময়, হাইবারনেট বুঝতে পারবে যে UserAddress ক্লাসের ক্ষেত্রগুলিকে User class এর ক্ষেত্র হিসাবে বিবেচনা করা দরকার ।

গুরুত্বপূর্ণ ! আপনি যদি আপনার User ক্লাসে দুটি UserAddress ক্ষেত্র যোগ করার সিদ্ধান্ত নেন , তাহলে @Embedded ব্যবহার করে আর কাজ করবে না: আপনার কাছে ডুপ্লিকেট ক্ষেত্র থাকবে এবং আপনাকে সেগুলি আলাদা করতে হবে। এটি টীকাগুলি ওভাররাইড করে করা হয়: @AttributeOverrides টীকা ব্যবহার করে ।

আমি আপনাকে এটি জানতে চাই, কিন্তু আমরা এখানে বিস্তারিতভাবে যাব না। আমি মনে করি আপনার মাথা ভাঙ্গার জন্য এটি যথেষ্ট। কৌতূহলীদের জন্য, আমি অফিসিয়াল ডকুমেন্টেশনের একটি লিঙ্ক ছেড়ে দিতে পারি ।