জেপিএর কেন @ ট্রান্সিয়েন্ট টিকা আছে?


283

জাভা transientকিওয়ার্ড আছে। @Transientইতিমধ্যে বিদ্যমান জাভা কীওয়ার্ডটি ব্যবহার করার পরিবর্তে কেন জেপিএ আছে ?

উত্তর:


455

জাভাটির transientকীওয়ার্ডটি বোঝানো হয় যে কোনও ক্ষেত্রকে সিরিয়ালকরণ করা হবে না, যেখানে জেপিএর @Transientটীকাগুলি নির্দেশ করে যে কোনও ক্ষেত্রটি ডাটাবেসে স্থির রাখতে হবে না, অর্থাত্ তাদের শব্দার্থবিজ্ঞান আলাদা।


3
হ্যাঁ, শব্দার্থবিজ্ঞান আলাদা। তবে কেন জেপিএকে এভাবে ডিজাইন করা হয়েছিল?
দিলুম রানাতুঙ্গা

1
নিশ্চিত না যে আমি আপনাকে বুঝতে পেরেছি, তবে "পাস্কাল থিভেন্ট" এর উত্তরটি দেখুন;)
জাওহর

30
এটি সুবিধাজনক কারণ আপনি হয়ত ডাটাবেসে ডেটা সংরক্ষণ করতে না চাইলেও আপনি এটি জেপিএ চাচিং সিস্টেমে সংরক্ষণ করতে চান যা সত্তাগুলির সঞ্চয় / পুনরুদ্ধারের জন্য সিরিয়ালাইজেশন ব্যবহার করে।
কেডেভোপার

1
সত্তাগুলি সংরক্ষণ / পুনরুদ্ধারের জন্য সিরিয়ালাইজেশন ব্যবহার করে এমন কোন "জেপিএ ক্যাচিং সিস্টেম"? একটি জেপিএ বাস্তবায়ন কোনও বস্তুকে তারা যেভাবে ইচ্ছা ক্যাশে করতে পারে এবং সিরিয়ালাইজেশন এতে প্রবেশ করে না।
ডেটা নিউক্লিয়াস

@ জাওহর, এখানে ক্ষণস্থায়ী নয়, প্রেসিডেন্টের অর্থ কোনও মান প্রেসিডেন্ট না করা বা এটি সেই বৈশিষ্ট্যের জন্য ডিফল্ট মান সন্নিবেশ করবে।
সতীশ শর্মা 11

115

কারণ তাদের বিভিন্ন অর্থ রয়েছে। @Transientটীকা কোনো (অ- জিদ না JPA প্রদানকারী বলে transient) অ্যাট্রিবিউট। অন্যটি সিরিয়ালাইজেশনের কাঠামোটিকে কোনও অ্যাট্রিবিউটকে ক্রমিকায়িত না করতে বলে। আপনি একটি @Transientসম্পত্তি পেতে এবং এখনও এটি সিরিয়াল করতে চাইতে পারেন ।


উত্তরের জন্য ধন্যবাদ পাস্কাল। আপনার মন্তব্যের একটি নোট হিসাবে: "আপনি একটি @ ট্রান্সিয়েন্ট সম্পত্তি পেতে চান এবং এখনও এটি সিরিয়ালাইজ করতে পারেন।" (আমি এটিই সন্ধান করছিলাম) আমি এটিও যুক্ত করতে চাই যে বিপরীতটি সত্য নয়। যদি কেউ পরিবর্তনশীল হিসাবে কোনও ভেরিয়েবল সেট করে থাকে তবে আপনি এটি চালিয়ে যেতে পারবেন না।
jfajunior

96

অন্যরা যেমন বলেছে, @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


@psp আপনি কীভাবে / কীভাবে অনির্দিষ্ট আচরণের কারণ হতে পারেন সে সম্পর্কে আরও ব্যাখ্যা করতে পারেন? ধন্যবাদ!
তাইদকম্যান

@ 40Plot স্পেসিফিকেশন অনুযায়ী তাই
PSP

7
এটি হ'ল এটি গ্রহণযোগ্য উত্তর হ'ল কারণ এটি অনেক বেশি ব্যাখ্যা করছে যে বর্তমান গৃহীত এক ...
হনজা জিদেক

53

উদ্দেশ্য পৃথক:

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


1
যদি সেগুলি প্রকৃতপক্ষে আলাদা উদ্বেগ হয় তবে অবশ্যই একটি আলাদা শব্দ রয়েছে যা সংক্ষিপ্তসারগুলি ধারণ করে। শব্দটি কেন ওভারলোড? একটি স্টার্টার পরামর্শ হিসাবে @Unpersisted,।
দিলুম রানাতুঙ্গা

4
আমি ব্যক্তিগতভাবে পছন্দ করি @Ephemeral। মেরিয়াম ওয়েস্টার এর মতে: ১ ep০০-এর দশকে যখন ক্ষণিকের প্রথম ইংরেজিতে ছাপা হয়েছিল, "এটি একটি বিজ্ঞানসম্মত শব্দ ছিল যা স্বল্প-কালীন ফ্যভারের জন্য প্রয়োগ করা হয়েছিল এবং পরবর্তীকালে খুব কম জীবনকাল সহ জীবদেহে (যেমন পোকামাকড় এবং ফুল) প্রয়োগ করা হয়েছিল। এর পরেই , এটি ক্ষণস্থায়ী এবং স্বল্পস্থায়ী যে কোনও বিষয়কে বোঝায় ("সাময়িক আনন্দ" হিসাবে) একটি বর্ধিত জ্ঞান অর্জন করেছিল।
অস্টিন ডি

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

17

আপনি যদি চান তবে কোনও ক্ষেত্র স্থায়ী হবে না, ক্ষণস্থায়ী এবং @ ট্রান্সিয়েন্ট উভয় কাজ। তবে প্রশ্ন হ'ল @ ট্রান্সিয়েন্ট যেহেতু ক্ষণস্থায়ী ইতিমধ্যে বিদ্যমান।

কারণ @ ট্রান্সিয়েন্ট ক্ষেত্রটি এখনও সিরিয়ালযুক্ত হবে!

ধরুন আপনি কোনও সত্তা তৈরি করেছেন, ফলাফল পাওয়ার জন্য কিছু সিপিইউ-গ্রাহক গণনা করছেন এবং এই ফলাফলটি ডাটাবেসে সংরক্ষণ করবে না। তবে আপনি জেএমএস দ্বারা ব্যবহার করার জন্য সত্তাকে অন্য জাভা অ্যাপ্লিকেশনগুলিতে প্রেরণ করতে চান, তবে আপনার @Transientজাভাএসই কীওয়ার্ড নয়, ব্যবহার করা উচিত transient। সুতরাং অন্যান্য ভিএমগুলিতে চলমান রিসিভারগুলি পুনরায় গণনা করার জন্য তাদের সময় বাঁচাতে পারে।


আপনি আরও স্পষ্ট করতে উদাহরণ প্রদান করতে পারেন?
হর্ষ কনখারা

এমন কোনও টীকা আছে যা জেপিএ ক্ষণস্থায়ী হিসাবে বিবেচনা করবে তবে জ্যাকসন তা করবে না?
কল্পনা সনি

0

"কেন" এই প্রশ্নের উত্তর দেওয়ার চেষ্টা করব। এমন একটি পরিস্থিতি কল্পনা করুন যেখানে আপনার একটি টেবিলের প্রচুর কলাম সহ বিশাল ডাটাবেস রয়েছে এবং আপনার প্রকল্প / সিস্টেমটি ডাটাবেস থেকে সত্তা তৈরি করতে সরঞ্জামগুলি ব্যবহার করে। (হাইবারনেটে সেগুলি রয়েছে, ইত্যাদি ...) এখন, ধরুন যে আপনার ব্যবসায়িক যুক্তি অনুসারে আপনার একটি নির্দিষ্ট ক্ষেত্রটি অবিচল থাকার প্রয়োজন নেই। আপনাকে একটি নির্দিষ্ট উপায়ে আপনার সত্তাকে "কনফিগার" করতে হবে। ট্রান্সিয়েন্ট কীওয়ার্ড কোনও বস্তুর উপর কাজ করার সময় - এটি একটি জাভা ভাষার মধ্যে যেমন আচরণ করে, @ ট্রান্সিয়েন্ট কেবলমাত্র অধ্যবসায়ের কাজগুলির সাথে সম্পর্কিত সেই কার্যগুলির উত্তর দেওয়ার জন্য নকশাকৃত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.