অবিচ্ছিন্ন এনামসেট রাখার জন্য আমি java.util.RegularEnumSet এর সামান্য পরিবর্তন ব্যবহার করছি:
@MappedSuperclass
@Access(AccessType.FIELD)
public class PersistentEnumSet<E extends Enum<E>>
extends AbstractSet<E> {
private long elements;
@Transient
private final Class<E> elementType;
@Transient
private final E[] universe;
public PersistentEnumSet(final Class<E> elementType) {
this.elementType = elementType;
try {
this.universe = (E[]) elementType.getMethod("values").invoke(null);
} catch (final ReflectiveOperationException e) {
throw new IllegalArgumentException("Not an enum type: " + elementType, e);
}
if (this.universe.length > 64) {
throw new IllegalArgumentException("More than 64 enum elements are not allowed");
}
}
}
এই শ্রেণিটি এখন আমার সমস্ত এনাম সেটের ভিত্তি:
@Embeddable
public class InterestsSet extends PersistentEnumSet<InterestsEnum> {
public InterestsSet() {
super(InterestsEnum.class);
}
}
এবং এই সেটটি আমি আমার সত্তায় ব্যবহার করতে পারি:
@Entity
public class MyEntity {
@Embedded
@AttributeOverride(name="elements", column=@Column(name="interests"))
private InterestsSet interests = new InterestsSet();
}
সুবিধাদি:
- আপনার কোডে সুরক্ষিত এবং পারফরম্যান্ট এনাম সেট টাইপের সাথে কাজ করা (
java.util.EnumSet
কোনও বিবরণের জন্য দেখুন )
- সেটটি ডাটাবেসে কেবল একটি সংখ্যার কলাম
- সবকিছু সাধারণ জেপিএ (কোনও সরবরাহকারীর নির্দিষ্ট কাস্টম ধরণের নয় )
- অন্যান্য সমাধানের তুলনায় একই ধরণের নতুন ক্ষেত্রগুলির সহজ (এবং সংক্ষিপ্ত) ঘোষণা decla
ত্রুটিগুলি:
- কোড সদৃশ (
RegularEnumSet
এবং PersistentEnumSet
প্রায় একই)
- আপনি ফল মোড়ানো পারে
EnumSet.noneOf(enumType)
আপনার PersistenEnumSet
ঘোষণা AccessType.PROPERTY
এবং যা প্রতিফলন ব্যবহার দুই এক্সেস পদ্ধতি পড়তে এবং লিখতে elements
ক্ষেত্র
- প্রতিটি এনাম ক্লাসের জন্য একটি অতিরিক্ত সেট শ্রেণীর প্রয়োজন যা একটি অবিরাম সেটগুলিতে সঞ্চয় করা উচিত
- যদি আপনার অধ্যবসায় সরবরাহকারী কোনও পাবলিক কনস্ট্রাক্টর ছাড়াই এম্বেডেবলগুলিকে সমর্থন করে তবে
@Embeddable
আপনি PersistentEnumSet
অতিরিক্ত ক্লাসে যোগ এবং ফেলে দিতে পারেন ( ... interests = new PersistentEnumSet<>(InterestsEnum.class);
)
- আপনি অবশ্যই একটি ব্যবহার করতে হবে
@AttributeOverride
, যেমন আমার উদাহরণে দেওয়া আছে, যদি আপনি PersistentEnumSet
আপনার সত্তায় একাধিক পেয়ে থাকেন (অন্যথায় উভয়ই একই কলামে "উপাদান" সংরক্ষণ করা হবে)
values()
কনস্ট্রাক্টরের প্রতিবিম্ব সহ অ্যাক্সেস অনুকূল নয় (বিশেষত পারফরম্যান্সের দিকে তাকানোর সময়), তবে অন্য দুটি বিকল্পেরও রয়েছে তাদের ত্রুটিগুলি:
- একটি বাস্তবায়ন যেমন
EnumSet.getUniverse()
একটি sun.misc
শ্রেণীর ব্যবহার করে
- মানগুলিকে প্যারামিটার হিসাবে সরবরাহ করার ক্ষেত্রে ঝুঁকি রয়েছে যে প্রদত্ত মানগুলি সঠিক মান নয়
- কেবলমাত্র 64৪ টি মান সহ এনামগুলি সমর্থিত (এটি কি সত্যই একটি ব্যর্থতা?)
- আপনি এর পরিবর্তে বিগইন্টিজার ব্যবহার করতে পারেন
- কোনও মানদণ্ডের ক্যোয়ারী বা জেপিকিউএল এ উপাদানগুলির ক্ষেত্রটি ব্যবহার করা সহজ নয়
- আপনি যদি বাইনারি অপারেটর বা বিটমাস্ক কলামটি উপযুক্ত ফাংশন সহ ব্যবহার করতে পারেন, যদি আপনার ডাটাবেস এটি সমর্থন করে