উত্তর:
জাভাটির transient
কীওয়ার্ডটি বোঝানো হয় যে কোনও ক্ষেত্রকে সিরিয়ালকরণ করা হবে না, যেখানে জেপিএর @Transient
টীকাগুলি নির্দেশ করে যে কোনও ক্ষেত্রটি ডাটাবেসে স্থির রাখতে হবে না, অর্থাত্ তাদের শব্দার্থবিজ্ঞান আলাদা।
কারণ তাদের বিভিন্ন অর্থ রয়েছে। @Transient
টীকা কোনো (অ- জিদ না JPA প্রদানকারী বলে transient
) অ্যাট্রিবিউট। অন্যটি সিরিয়ালাইজেশনের কাঠামোটিকে কোনও অ্যাট্রিবিউটকে ক্রমিকায়িত না করতে বলে। আপনি একটি @Transient
সম্পত্তি পেতে এবং এখনও এটি সিরিয়াল করতে চাইতে পারেন ।
অন্যরা যেমন বলেছে, @Transient
ক্ষেত্রগুলি চিহ্নিত করতে ব্যবহার করা হয় যা অবিরত করা উচিত নয়। এই সংক্ষিপ্ত উদাহরণ বিবেচনা করুন:
public enum Gender { MALE, FEMALE, UNKNOWN }
@Entity
public Person {
private Gender g;
private long id;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public long getId() { return id; }
public void setId(long id) { this.id = id; }
public Gender getGender() { return g; }
public void setGender(Gender g) { this.g = g; }
@Transient
public boolean isMale() {
return Gender.MALE.equals(g);
}
@Transient
public boolean isFemale() {
return Gender.FEMALE.equals(g);
}
}
এই শ্রেণিটি জেপিএকে খাওয়ানো হলে, এটি চালিয়ে যায় gender
এবং id
সহায়ক বুলিয়ান পদ্ধতি অব্যাহত রাখার চেষ্টা করে না - @Transient
অন্তর্নিহিত সিস্টেম ব্যতীত অভিযোগ করবে যে সত্তা শ্রেণি Person
অনুপস্থিত setMale()
এবং setFemale()
পদ্ধতিগুলি একেবারেই স্থির থাকবে না Person
।
উদ্দেশ্য পৃথক:
transient
শব্দ এবং @Transient
সঙ্গে এক পুলিশ: টীকা দুটি ভিন্ন উদ্দেশ্য আছে ধারাবাহিকতাতে এবং সঙ্গে এক পুলিশ অধ্যবসায় । প্রোগ্রামার হিসাবে, আমরা প্রায়শই এই দুটি ধারণাকে একটিতে বিবাহ করি, তবে এটি সাধারণভাবে সঠিক নয়। অধ্যবসায় রাষ্ট্রের বৈশিষ্ট্যকে বোঝায় যা এটি তৈরির প্রক্রিয়াটিকে আউটলাইভ করে। জাভাতে সিরিয়ালাইজেশন বলতে কোনও বাইট স্ট্রিম হিসাবে কোনও বস্তুর অবস্থার এনকোডিং / ডিকোডিংয়ের প্রক্রিয়া বোঝায়।
transient
শব্দ আর একটি শক্তিশালী অবস্থা @Transient
:
যদি কোনও ক্ষেত্রটি transient
কীওয়ার্ড ব্যবহার করে তবে অবজেক্টটি বাইট স্ট্রিমে রূপান্তরিত হলে সেই ক্ষেত্রটি সিরিয়ালযুক্ত হবে না। অধিকন্তু, যেহেতু জেপিএ transient
কীওয়ার্ড সহ চিহ্নিত ক্ষেত্রগুলিকে @Transient
টীকাগুলি হিসাবে গণ্য করে , তাই ক্ষেত্রটি জেপিএ দ্বারা স্থির থাকবে না।
অন্যদিকে, অবজেক্টটি সিরিয়ালাইজ করা হলে @Transient
একা বর্ণিত ক্ষেত্রগুলি বাইট স্ট্রমে রূপান্তরিত হবে , তবে এটি জেপিএ দ্বারা স্থির থাকবে না। সুতরাং, মূলশব্দটি টীকাগুলির transient
চেয়ে শক্তিশালী শর্ত @Transient
।
উদাহরণ
এটি প্রশ্নটি জাগায়: কেন কেউ এমন একটি ক্ষেত্র ক্রমিক করতে চান যা অ্যাপ্লিকেশনটির ডেটাবেজে স্থায়ী নয়? বাস্তবতা হ'ল সিরিয়ালাইজেশন কেবল অধ্যবসায়ের চেয়ে বেশি ব্যবহার করা হয় । একটি এন্টারপ্রাইজ জাভা অ্যাপ্লিকেশনটিতে বিতরণ উপাদানগুলির মধ্যে অবজেক্ট বিনিময় করার জন্য একটি ব্যবস্থা থাকা দরকার ; সিরিয়ালাইজেশন এটি পরিচালনা করার জন্য একটি সাধারণ যোগাযোগ প্রোটোকল সরবরাহ করে। সুতরাং, আন্তঃ-উপাদান যোগাযোগের উদ্দেশ্যে কোনও ক্ষেত্র সমালোচনামূলক তথ্য রাখতে পারে; তবে সেই একই ক্ষেত্রটির অধ্যবসায় দৃষ্টিভঙ্গির কোনও মূল্য থাকতে পারে না।
উদাহরণস্বরূপ, ধরুন কোনও সার্ভারে একটি অপ্টিমাইজেশন অ্যালগরিদম চালিত হয়েছে এবং ধরুন এই অ্যালগরিদমটি সম্পূর্ণ হতে কয়েক ঘন্টা সময় নেয়। ক্লায়েন্টের কাছে সমাধানের সর্বাধিক আপ-টু-ডেট সেট থাকা জরুরী। সুতরাং, কোনও ক্লায়েন্ট সার্ভারে সাবস্ক্রাইব করতে এবং অ্যালগরিদমের কার্য সম্পাদন পর্যায়ে পর্যায়ক্রমিক আপডেটগুলি পেতে পারেন। এই আপডেটগুলি ProgressReport
অবজেক্টটি ব্যবহার করে সরবরাহ করা হয়েছে :
@Entity
public class ProgressReport implements Serializable{
private static final long serialVersionUID = 1L;
@Transient
long estimatedMinutesRemaining;
String statusMessage;
Solution currentBestSolution;
}
Solution
বর্গ ভালো চেহারা পারে:
@Entity
public class Solution implements Serializable{
private static final long serialVersionUID = 1L;
double[][] dataArray;
Properties properties;
}
সার্ভারটি প্রতিটি ProgressReport
তার ডাটাবেসে স্থির থাকে । সার্ভার অবিচলিত থাকার যত্ন নেয় না estimatedMinutesRemaining
, তবে ক্লায়েন্ট অবশ্যই এই তথ্যটি যত্ন করে। অতএব, estimatedMinutesRemaining
ব্যবহার করে টীকায়িত হয় @Transient
। ফাইনালটি Solution
অ্যালগরিদমের দ্বারা অবস্থিত হলে, এটি কোনও ব্যবহার না করে সরাসরি জেপিএ দ্বারা চালিত হয় ProgressReport
।
@Unpersisted
,।
@Ephemeral
। মেরিয়াম ওয়েস্টার এর মতে: ১ ep০০-এর দশকে যখন ক্ষণিকের প্রথম ইংরেজিতে ছাপা হয়েছিল, "এটি একটি বিজ্ঞানসম্মত শব্দ ছিল যা স্বল্প-কালীন ফ্যভারের জন্য প্রয়োগ করা হয়েছিল এবং পরবর্তীকালে খুব কম জীবনকাল সহ জীবদেহে (যেমন পোকামাকড় এবং ফুল) প্রয়োগ করা হয়েছিল। এর পরেই , এটি ক্ষণস্থায়ী এবং স্বল্পস্থায়ী যে কোনও বিষয়কে বোঝায় ("সাময়িক আনন্দ" হিসাবে) একটি বর্ধিত জ্ঞান অর্জন করেছিল।
transient
ক্ষেত্রগুলিকে স্পষ্টতই @Transient
টীকাটি হিসাবে দেখায় । সুতরাং আপনি যদি transient
কোনও ক্ষেত্রের সিরিয়ালাইজেশন প্রতিরোধ করতে কীওয়ার্ডটি ব্যবহার করেন তবে এটি ডেটাবেসেও শেষ হবে না।
আপনি যদি চান তবে কোনও ক্ষেত্র স্থায়ী হবে না, ক্ষণস্থায়ী এবং @ ট্রান্সিয়েন্ট উভয় কাজ। তবে প্রশ্ন হ'ল @ ট্রান্সিয়েন্ট যেহেতু ক্ষণস্থায়ী ইতিমধ্যে বিদ্যমান।
কারণ @ ট্রান্সিয়েন্ট ক্ষেত্রটি এখনও সিরিয়ালযুক্ত হবে!
ধরুন আপনি কোনও সত্তা তৈরি করেছেন, ফলাফল পাওয়ার জন্য কিছু সিপিইউ-গ্রাহক গণনা করছেন এবং এই ফলাফলটি ডাটাবেসে সংরক্ষণ করবে না। তবে আপনি জেএমএস দ্বারা ব্যবহার করার জন্য সত্তাকে অন্য জাভা অ্যাপ্লিকেশনগুলিতে প্রেরণ করতে চান, তবে আপনার @Transient
জাভাএসই কীওয়ার্ড নয়, ব্যবহার করা উচিত transient
। সুতরাং অন্যান্য ভিএমগুলিতে চলমান রিসিভারগুলি পুনরায় গণনা করার জন্য তাদের সময় বাঁচাতে পারে।
"কেন" এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করব। এমন একটি পরিস্থিতি কল্পনা করুন যেখানে আপনার একটি টেবিলের প্রচুর কলাম সহ বিশাল ডাটাবেস রয়েছে এবং আপনার প্রকল্প / সিস্টেমটি ডাটাবেস থেকে সত্তা তৈরি করতে সরঞ্জামগুলি ব্যবহার করে। (হাইবারনেটে সেগুলি রয়েছে, ইত্যাদি ...) এখন, ধরুন যে আপনার ব্যবসায়িক যুক্তি অনুসারে আপনার একটি নির্দিষ্ট ক্ষেত্রটি অবিচল থাকার প্রয়োজন নেই। আপনাকে একটি নির্দিষ্ট উপায়ে আপনার সত্তাকে "কনফিগার" করতে হবে। ট্রান্সিয়েন্ট কীওয়ার্ড কোনও বস্তুর উপর কাজ করার সময় - এটি একটি জাভা ভাষার মধ্যে যেমন আচরণ করে, @ ট্রান্সিয়েন্ট কেবলমাত্র অধ্যবসায়ের কাজগুলির সাথে সম্পর্কিত সেই কার্যগুলির উত্তর দেওয়ার জন্য নকশাকৃত।