আমি জেপিএ (বাস্তবায়ন হাইবারনেট) এর সাথে কিছু সময়ের জন্য কাজ করছি এবং প্রতিবার যখন সত্ত্বা তৈরি করতে হবে তখন আমি নিজেকে অ্যাক্সেসটাইপ, অপরিবর্তনীয় বৈশিষ্ট্য, সমান / হ্যাশকোড, ... হিসাবে সমস্যা নিয়ে লড়াই করতে দেখি।
সুতরাং আমি প্রতিটি ইস্যুর জন্য সাধারণ সেরা অনুশীলনটি চেষ্টা করার চেষ্টা করব এবং এটি ব্যক্তিগত ব্যবহারের জন্য লিখে রাখব write
এতে কারও মন্তব্য করা বা আমি কোথায় ভুল করছি তা বলার জন্য আমি আপত্তি করব না।
সত্তা ক্লাস
সিরিয়ালাইজেবল বাস্তবায়ন করুন
কারণ: স্পেসিফিকেশনটি আপনাকে বলেছে, তবে কিছু জেপিএ সরবরাহকারী এটি প্রয়োগ করে না। জেপিএ সরবরাহকারী হিসাবে হাইবারনেট এটি প্রয়োগ করে না, তবে সিরিয়ালাইজেবল বাস্তবায়ন না করা থাকলে ক্লাসকাস্টএক্সসেপশন সহ এটি তার পেটের গভীরে কোথাও ব্যর্থ হতে পারে।
কন্সট্রাকটর
সত্তার সমস্ত প্রয়োজনীয় ক্ষেত্র সহ একটি কনস্ট্রাক্টর তৈরি করুন
কারণ: একজন কনস্ট্রাক্টরকে সর্বদা বুদ্ধিমান অবস্থায় তৈরি করা দৃষ্টান্তটি ছেড়ে দেওয়া উচিত।
এই কনস্ট্রাক্টর ছাড়াও: একটি প্যাকেজ বেসরকারী ডিফল্ট কনস্ট্রাক্টর রয়েছে
কারণ: হাইবারনেট সত্তাটি আরম্ভ করার জন্য ডিফল্ট নির্মাণকারীর প্রয়োজন; ব্যক্তিগত অনুমোদিত তবে রানটাইম প্রক্সি জেনারেশন এবং বাইটকোড উপকরণ ছাড়াই দক্ষ ডেটা পুনরুদ্ধারের জন্য প্যাকেজ ব্যক্তিগত (বা সর্বজনীন) দৃশ্যমানতা প্রয়োজনীয়।
ক্ষেত্রসমূহ / বিষয়বস্তু
প্রয়োজনে সাধারণ ক্ষেত্র অ্যাক্সেস এবং সম্পত্তি অ্যাক্সেস ব্যবহার করুন
কারণ: এটি সম্ভবত সবচেয়ে বিতর্কিত বিষয়, যেহেতু একজন বা অন্যের জন্য কোনও স্পষ্ট এবং বিশ্বাসযোগ্য যুক্তি (সম্পত্তি অ্যাক্সেস বনাম ক্ষেত্রের প্রবেশাধিকার) নেই; তবে ক্লিয়ারার কোড, আরও ভাল এনক্যাপসুলেশন এবং অপরিবর্তনীয় ক্ষেত্রগুলির জন্য সেটটার তৈরি করার প্রয়োজন নেই বলে ফিল্ড অ্যাক্সেস সাধারণ পছন্দ বলে মনে হচ্ছে
অপরিবর্তনীয় ক্ষেত্রগুলির জন্য ওমিট সেটারগুলি (অ্যাক্সেসের ধরণের ক্ষেত্রে প্রয়োজন হয় না)
- বৈশিষ্ট্যগুলি ব্যক্তিগত হতে পারে
কারণ: আমি একবার শুনেছি সুরক্ষিত (হাইবারনেট) পারফরম্যান্সের জন্য ভাল তবে ওয়েবে আমি যা পাই তা হ'ল: হাইবারনেট পাবলিক, প্রাইভেট এবং সুরক্ষিত অ্যাক্সেসরের পদ্ধতিগুলি পাশাপাশি সরকারী, ব্যক্তিগত এবং সুরক্ষিত ক্ষেত্রগুলিতে সরাসরি অ্যাক্সেস করতে পারে । পছন্দটি আপনার উপর নির্ভর করে এবং আপনার অ্যাপ্লিকেশন ডিজাইনের সাথে মানিয়ে নিতে আপনি এটি মেলাতে পারেন।
সমান / হ্যাশকোড
- এই আইডিটি কেবল সত্তা অবিরত থাকার সময় সেট করা থাকলে কখনই উত্পন্ন আইডি ব্যবহার করবেন না
- পছন্দ অনুসারে: অনন্য ব্যবসায়ের কী তৈরির জন্য অপরিবর্তনীয় মানগুলি ব্যবহার করুন এবং সমতা পরীক্ষা করতে এটি ব্যবহার করুন
- যদি কোনও অনন্য ব্যবসায়ের কীটি উপলভ্য না হয় তবে কোনও অস্থায়ী ইউআইডি ব্যবহার করুন যা সত্তা সূচনা করার সময় তৈরি করা হয়; দেখুন এই মহান নিবন্ধ আরও তথ্যের জন্য।
- সম্পর্কিত সংস্থাগুলি (ম্যান্টিটোইন) কে কখনই উল্লেখ করবেন না ; যদি এই সত্তাটিকে (পিতামাতার সত্তার মতো) বিজনেস কী এর অংশ হতে হয় তবে কেবল আইডিটির সাথে তুলনা করুন। প্রক্সিটিতে getId () কল করা যতক্ষণ আপনি সম্পত্তি অ্যাক্সেসের ধরণটি ব্যবহার করছেন ততক্ষণ সত্তার লোডিং ট্রিগার করবে না ।
সত্তার উদাহরণ
@Entity
@Table(name = "ROOM")
public class Room implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "room_id")
private Integer id;
@Column(name = "number")
private String number; //immutable
@Column(name = "capacity")
private Integer capacity;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "building_id")
private Building building; //immutable
Room() {
// default constructor
}
public Room(Building building, String number) {
// constructor with required field
notNull(building, "Method called with null parameter (application)");
notNull(number, "Method called with null parameter (name)");
this.building = building;
this.number = number;
}
@Override
public boolean equals(final Object otherObj) {
if ((otherObj == null) || !(otherObj instanceof Room)) {
return false;
}
// a room can be uniquely identified by it's number and the building it belongs to; normally I would use a UUID in any case but this is just to illustrate the usage of getId()
final Room other = (Room) otherObj;
return new EqualsBuilder().append(getNumber(), other.getNumber())
.append(getBuilding().getId(), other.getBuilding().getId())
.isEquals();
//this assumes that Building.id is annotated with @Access(value = AccessType.PROPERTY)
}
public Building getBuilding() {
return building;
}
public Integer getId() {
return id;
}
public String getNumber() {
return number;
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(getNumber()).append(getBuilding().getId()).toHashCode();
}
public void setCapacity(Integer capacity) {
this.capacity = capacity;
}
//no setters for number, building nor id
}
এই তালিকায় যুক্ত করার জন্য অন্যান্য পরামর্শগুলি স্বাগত হওয়ার চেয়ে আরও বেশি ...
হালনাগাদ
এই নিবন্ধটি পড়ার পর থেকে আমি একা / এইচসি বাস্তবায়নের আমার পদ্ধতিটি মানিয়ে নিয়েছি:
- যদি একটি অপরিবর্তনীয় সহজ ব্যবসায়িক কী উপলব্ধ থাকে: এটি ব্যবহার করুন
- অন্যান্য সমস্ত ক্ষেত্রে: একটি ইউইড ব্যবহার করুন
final
(আপনার সেটটারদের বাদ দিয়ে বিচার করে, আমি অনুমান করব যে আপনিও করেন)।
notNull
থেকে আসে?