কখন এবং কেন জেপিএ সংস্থাগুলি সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করতে হবে?


151

প্রশ্ন শিরোনামে হয়। নীচে আমি আমার কিছু চিন্তাভাবনা এবং ফলাফলগুলি বর্ণনা করেছি।

যখন আমার খুব সাধারণ ডোমেন মডেল ছিল (কোনও সম্পর্ক ছাড়াই 3 টি টেবিল) তখন আমার সমস্ত সত্ত্বা সিরিয়ালিজেবল কার্যকর করে না।

তবে যখন ডোমেন মডেলটি আরও জটিল হয়ে উঠল তখন আমি রানটাইমএক্সসেপশন পেয়েছিলাম যা বলেছিল যে আমার সত্তাগুলির একটি সিরিয়ালিজেবল প্রয়োগ করে না।

আমি হাইবারনেটকে জেপিএ প্রয়োগ হিসাবে ব্যবহার করি।

আমি অবাক:

  1. এটি কি বিক্রেতা-নির্দিষ্ট প্রয়োজনীয়তা / আচরণ?
  2. আমার ক্রমিক সংস্থাগুলির সাথে কী ঘটে? সেগুলি সংরক্ষণের জন্য বা স্থানান্তর করার জন্য সিরিয়ালযোগ্য হওয়া উচিত?
  3. কোন মুহুর্তে আমার সত্তাকে সিরিয়ালযোগ্য করে তোলা প্রয়োজন?

উত্তর:


59

আপনি যদি এইচকিউএল এবং নেটিভ এসকিউএল কোয়েরিগুলি মিশ্রিত করেন তবে এটি সাধারণত ঘটে থাকে। এইচকিউএলে, হাইবারনেট ডিবি যেভাবে বোঝে আপনি তার মধ্যে যে ধরণের পাস করেছেন তা ম্যাপ করে। আপনি যখন নেটিভ এসকিউএল চালান, তখন আপনাকে নিজেরাই ম্যাপিং করতে হবে। যদি আপনি এটি না করেন তবে ডিফল্ট ম্যাপিং হ'ল প্যারামিটারটি ক্রমিক করে তা ডাটাবেসে প্রেরণ করা (এই আশায় যে এটি এটি বুঝতে পারে) understand


বোজহো থেকে কেবল "সম্ভবত কীভাবে" উত্তর দেখুন

সিরিয়ালাইজযোগ্য ইন্টারফেস বাস্তবায়নের সাথে সত্তা কী ডিবিতে সংরক্ষণ করা হবে?
হনুমান্থ_3048092

@ হনুমান্থ_3048092 হ্যাঁ। সত্তা ম্যাপিং এবং Serializableদুটি ভিন্ন ধারণা ts
অ্যারন ডিজুল্লা

@ অ্যারোনডিগুল্লা আপনি দয়া করে এটি একটি উদাহরণ বা সিউডো কোড দ্বারা ব্যাখ্যা করতে পারেন।
sdindiver

110

জেপিএ স্পেস অনুসারে:

যদি কোনও সত্তার উদাহরণটি আলাদাভাবে অবজেক্ট হিসাবে (যেমন, দূরবর্তী ইন্টারফেসের মাধ্যমে) মান দিয়ে যেতে হয়, সত্তা শ্রেণিকে অবশ্যই সিরিয়ালাইজেবল ইন্টারফেস প্রয়োগ করতে হবে।

"জেএসআর 220: এন্টারপ্রাইজ জাভাবিএনএসটিএম, সংস্করণ 3.0 জাভা পার্সিস্টান এপিআই সংস্করণ 3.0, চূড়ান্ত প্রকাশ 2 মে, 2006"


14
(+1) স্পেকের দিকে
তাকানো

20
এটি কেন এত বেশি উত্সাহ নিয়েছে তা আমি দেখতে ব্যর্থ। ওপি বলছে যে মডেলটি যখন সহজ ছিল তখন এটির প্রয়োজন ছিল না। জাভা সিরিয়ালাইজেশনের মাধ্যমে দূরবর্তীভাবে অবজেক্টগুলি প্রেরণের জন্য বস্তুগুলির জটিলতা নির্বিশেষে সবসময় সিরিয়ালাইজযোগ্য হতে হবে। অবশ্যই এটি অপির ব্যবহারের ক্ষেত্রে নয় isn't
রবিন

হাইবারনেট সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে অন্যান্য জেপিএ সরবরাহকারীদের সাথে এমন ক্রিয়াকলাপ রয়েছে যা সরবরাহকারীর একটি সত্তার (অবজেক্ট) অনুলিপি তৈরি করতে হবে। Serializableএটির সাথে সহায়ক হতে পারে, এবং দৃistence়তার প্রসঙ্গে Cloneableউদাহরণের চেয়ে আরও সুসংগত ।
জিমিবি

এই উত্তরটি কেবল একটি তথ্য ডাম্প এবং কারও কারণ বুঝতে কেউ সহায়তা করে না।
ক্রিস্প

59

আপনার নিজের সত্ত্বাগুলি হওয়া দরকার Serializableযদি তাদের ওভার-দ্য ওয়্যারটি স্থানান্তর করতে হয় (তাদেরকে অন্য কোনও উপস্থাপনায় সিরিয়াল করুন), সেগুলি HTTP সেশনে সংরক্ষণ করুন (যা পরিবর্তে সার্ভলেট ধারক দ্বারা হার্ড ডিস্কে সিরিয়ালায়িত করা হয়), ইত্যাদি etc.

কেবল অধ্যবসায়ের স্বার্থে, Serializableপ্রয়োজন হয় না, কমপক্ষে হাইবারনেট সহ। তবে এগুলি তৈরি করা একটি সেরা অনুশীলন Serializable


2
আমি জানি না, সম্ভবত আমার সত্তা কোথাও অন্তর্নিহিত স্থানান্তরিত হচ্ছে। আমি হাইবারনেট + বসন্ত + জেএসএফ এবং টমকেট ব্যবহার করি। এই চেইনে স্থানান্তর কোথায় হতে পারে?
রোমান

@ রোমান উদাহরণস্বরূপ বর্তমান ব্যবহারকারীর (যা কোনও সত্তা হতে পারে) এবং এর সাথে সম্পর্কিত সমস্ত সেশনটি অধিবেশনটিতে শেষ হতে পারে, যা বোজহো বলেছে সার্ভলেট ধারক দ্বারা ডিস্কে সিরিয়ালাইজ করা যেতে পারে।
অরেঞ্জডগ

এই "কেন এবং কখন" সেরা উত্তর! স্পষ্ট! আপনাকে ধন্যবাদ
চিপস

13

হাইপারনেট ডক্স অনুসারে , @ জয়লঙ্কল টীকাটি ব্যবহার করার সময়:

এটির আরও একটি পরামিতি রয়েছে referencedColumnName। এই পরামিতিটি লক্ষ্যযুক্ত সত্তায় কলামটি ঘোষণা করে যা যোগদানের জন্য ব্যবহৃত হবে। নোট করুন যে referencedColumnNameকোনও অ প্রাথমিক প্রাথমিক কলামটি ব্যবহার করার সময় , সম্পর্কিত শ্রেণিটি থাকতে হবে Serializable


8

জেএসআর -317 নির্দিষ্টকরণগুলিকে রেফারেন্স করিয়ে দেওয়া কনরের চমৎকার উত্তরের পরিপূরক। সাধারণত, EAR প্রকল্পগুলিতে একটি EJB মডিউল থাকে যা EJB গুলি দূরবর্তী ইন্টারফেসের মাধ্যমে প্রকাশিত হয়। এই এক ক্ষেত্রে আপনাকে আপনার সত্তা মটরশুটিগুলি সিরিয়ালাইজযোগ্য করতে হবে কারণ এগুলি দূরবর্তী ইজেবিতে একত্রিত হয় এবং নেটওয়ার্কের মাধ্যমে তারের তৈরির জন্য নির্মিত।

সিডিআই ছাড়াই একটি জেইই 6 যুদ্ধ প্রকল্প: অ-সিরিয়ালাইজযোগ্য জেপিএ সত্তা সমর্থনযুক্ত ইজেবি লাইট ধারণ করতে পারে।

সিডিআই সহ একটি জেই 6 যুদ্ধ প্রকল্প: সেশন, অ্যাপ্লিকেশন, বা কথোপকথনের স্কোপগুলি ব্যবহার করা মটরটি অবশ্যই সিরিয়ালাইজযোগ্য হতে হবে, তবে অনুরোধের সুযোগটি মটরশুটি ব্যবহার করে সিরিয়ালিয়াল হতে হবে না। সুতরাং অন্তর্নিহিত জেপিএ সত্তা মটরশুটি - যদি কোনও- একই শব্দার্থবিজ্ঞান অনুসরণ করবে।


7

যদি আমরা কেবল অধ্যবসায়ের বিষয়ে কথা বলি, Serializableপ্রয়োজন হয় না তবে সত্তা তৈরি করা ভাল অনুশীলন Serializable

যদি আমরা ব্যবহারের পরিবর্তে উপস্থাপনা স্তরটিতে সরাসরি অবজেক্ট domain/ entitiesঅবজেক্ট প্রকাশ করি DTOতবে সে ক্ষেত্রে আমাদের প্রয়োগ করতে হবে Serializableএই ডোমেন অবজেক্টগুলি HTTPSessionক্যাচিং / অপ্টিমাইজেশান উদ্দেশ্যে সংরক্ষণ করা যেতে পারে । একটি HTTP- সেশন ক্রমিক বা ক্লাস্টার করা যেতে পারে। এবং এটি JVMউপাদানগুলির মধ্যে ডেটা স্থানান্তর করার জন্যও প্রয়োজনীয় ।

আমরা যখন DTOঅধ্যবসায় স্তর এবং পরিষেবা স্তরটিকে ডিকুয়াল করার জন্য ব্যবহার করি তখন ডোমেন অবজেক্টগুলিকে চিহ্ন হিসাবে Serializableউত্পাদনশীল হবে এবং " encapsulation" লঙ্ঘন করবে । তারপরে এটি অ্যান্টি-প্যাটার্নে পরিণত হয়।

সম্মিলিত শনাক্তকারী

প্রাথমিক কী শ্রেণি অবশ্যই সিরিয়ালযোগ্য হবে।

POJO মডেল

যদি কোনও সত্তার উদাহরণটি দূরবর্তীভাবে কোনও পৃথক বস্তু হিসাবে ব্যবহার করতে হয়, সত্তা শ্রেণিটি অবশ্যই Serializableইন্টারফেসটি প্রয়োগ করবে implement

ক্যাশে
এছাড়াও, আপনি যদি clusteredদ্বিতীয় স্তরের প্রয়োগ করছেন cacheতবে আপনার সত্তা অবশ্যই হবে serializable। সনাক্তকারীটি Serializableহ'ল কারণ এটি একটি জেপিএ প্রয়োজনীয়তা, যেহেতু identifierসম্ভবত দ্বিতীয় স্তরের ক্যাশে প্রবেশের জন্য কী হিসাবে ব্যবহৃত হতে পারে।

এবং যখন আমরা সত্তাগুলি সিরিয়াল করি তখন serialVersionUIDব্যক্তিগত অ্যাক্সেস মডিফায়ারের সাথে সুস্পষ্ট সরবরাহ নিশ্চিত করে নিন make কারণ যদি কোনও serializableশ্রেণি স্পষ্টভাবে একটি ঘোষণা করে না serialVersionUID, তবে সিরিয়ালাইজেশন রানটাইম serialVersionUIDজাভা (টিএম) অবজেক্ট সিরিয়ালাইজেশন স্পেসিফিকেশনে বর্ণিত শ্রেণীর বিভিন্ন দিকের ভিত্তিতে সেই শ্রেণীর জন্য একটি ডিফল্ট মান গণনা করবে । ডিফল্ট serialVersionUIDগণনা শ্রেণীর বিবরণে অত্যন্ত সংবেদনশীল যা সংকলক বাস্তবায়নের উপর নির্ভর করে পৃথক হতে পারে এবং এর ফলে InvalidClassExceptionsdeserialization সময় অপ্রত্যাশিত হতে পারে ।


6

আমি বিশ্বাস করি যে আপনার সমস্যাটি জটিল টাইপের (শ্রেণি) ক্ষেত্র যা সম্পর্কিত নয় যা সম্পর্কিত নয় related এই জাতীয় ক্ষেত্রে ডিফল্ট হ্যান্ডলিংটি বস্তুটিকে তার ক্রমিক আকারে ডাটাবেসে সংরক্ষণ করবে (যা সম্ভবত আপনি বোঝাতে চেয়েছিলেন না) উদাহরণ:

Class CustomerData {
    int getAge();
    void setAge(int age);
}

@Entity
Class Customer {
  CustomerData getCustomerData();
  void setCustomerData(CustomerData data)
}

উপরের ক্ষেত্রে গ্রাহকদাতা তার ক্রমিক আকারে ডাটাবেসে একটি বাইট অ্যারে ক্ষেত্রে সংরক্ষণ করা হবে।


5

জেপিএ স্পেসিফিকেশন

জেপিএর স্পেসিফিকেশন অনুসারে, কোনও সত্তা Serializableকেবল তখনই প্রয়োগ করা উচিত যখন এটির একটি জেভিএম থেকে অন্য জেতে যাওয়ার প্রয়োজন হয় বা সত্তা কোনও স্টেটফুল সেশন বিন দ্বারা ব্যবহৃত হয় যা ইজেবি ধারক দ্বারা প্যাসিভেট করা প্রয়োজন।

যদি কোনও সত্তার উদাহরণটি আলাদাভাবে অবজেক্ট হিসাবে (যেমন, দূরবর্তী ইন্টারফেসের মাধ্যমে) মান দিয়ে যেতে হয়, সত্তা শ্রেণি অবশ্যই Serializableইন্টারফেসটি প্রয়োগ করবে ।

হাইবারনেট

হাইবারনেট কেবলমাত্র সত্তার বৈশিষ্ট্যগুলির প্রয়োজন Serializable , কিন্তু সত্তা নিজেই না।

তবে, জেপিএ স্পেসিফিকেশন বাস্তবায়ন, সম্পর্কিত সমস্ত জেপিএ প্রয়োজনীয়তা Serializable সত্তা হাইবারনেটের ক্ষেত্রেও প্রযোজ্য।

হুল বিড়াল

মতে হুল বিড়াল documantation , HttpSessionবৈশিষ্ট্যাবলী এছাড়াও হতে হবে Serializable:

যখনই অ্যাপাচি টমক্যাটটি স্বাভাবিকভাবে বন্ধ হয়ে যায় এবং পুনরায় চালু হয়, বা যখন অ্যাপ্লিকেশন পুনরায় লোড ট্রিগার করা হয় তখন স্ট্যান্ডার্ড ম্যানেজার বাস্তবায়ন প্যাথনাম অ্যাট্রিবিউটের মাধ্যমে অবস্থিত একটি ডিস্ক ফাইলটিতে সমস্ত সক্রিয় সেশনগুলিকে সিরিয়ালাইজ করার চেষ্টা করবে। অ্যাপ্লিকেশন পুনরায় লোড সম্পন্ন হওয়ার পরে এ জাতীয় সমস্ত সংরক্ষিত সেশনগুলি deserialized এবং সক্রিয় করা হবে (ধরে নেওয়া হবে যে এগুলি নিখরচায় সময়সীমা শেষ হয়নি) re

সেশন অ্যাট্রিবিউটসের অবস্থাটি সফলভাবে পুনরুদ্ধার করার জন্য, এই জাতীয় সমস্ত বৈশিষ্ট্য java.io.Serializable ইন্টারফেস প্রয়োগ করতে হবে।

সুতরাং, সত্তাটি যদি সংরক্ষণ করা থাকে তবে HttpSessionএটি প্রয়োগ করা উচিত Serializable


4

শ্রেণিগুলিকে অবশ্যই সিরিয়ালাইজযোগ্য প্রয়োগ করতে হবে যদি আপনি সেগুলি ক্রমিক করতে চান। এটি সরাসরি জেপিএ সম্পর্কিত নয় এবং জেপিএ নির্দিষ্টকরণের প্রয়োজন নেই যে সত্তাগুলি সিরিয়ালযোগ্য। হাইবারনেট যদি সত্যিই এই সম্পর্কে অভিযোগ করে তবে আমি মনে করি এটি একটি হাইবারনেট বাগ, তবে আমি মনে করি আপনি প্রত্যক্ষ বা অপ্রত্যক্ষভাবে সত্তাগুলির সাথে অন্য কিছু করছেন, যার জন্য এটি সিরিয়ালযোগ্য হতে হবে।


3

দয়া করে এটিতে http://www.adam-bien.com/roller/abien/entry/do_jpa_entities_have_to উল্লেখ করুন , jva.io.Simarizable বাস্তবায়ন কেবলমাত্র JVM- দৃষ্টান্তের মধ্যে IIOP বা JRMP (RMI) এর মাধ্যমে ডেটা স্থানান্তর করার জন্য প্রয়োজনীয়। খাঁটি ওয়েব অ্যাপ্লিকেশনের ক্ষেত্রে ডোমেন অবজেক্টগুলি কখনও কখনও ক্যাচিং / অপ্টিমাইজেশানের উদ্দেশ্যে এইচটিটিপিএসসনে সংরক্ষণ করা হয়। একটি এইচটিসি-সেশন সিরিয়ালাইজড (প্যাসিভেশন) বা ক্লাস্টারড হতে পারে। উভয় ক্ষেত্রেই সমস্ত বিষয়বস্তু সিরিয়ালযোগ্য হতে হবে।


1

পোস্টম্যান বা এজাক্স বা কৌণিক জেএস ইত্যাদি ব্যবহার করে রিমোট হিট, জ্যাকসন ফাস্টএক্সএমএল সহ স্ট্যাকওভারফ্লো ব্যতিক্রমের পুনরাবৃত্ত চক্রের কারণ হতে পারে o সুতরাং সিরিয়ালাইজার ব্যবহার করা ভাল।


1
  1. কোন মুহুর্তে আমার সত্তাকে সিরিয়ালযোগ্য করে তোলা প্রয়োজন?

দ্বিতীয় স্তরের ক্যাশে (যেমন @Cacheableসত্তা বা সংগ্রহশালা / পরিষেবা পদ্ধতিতে টীকা ব্যবহার করে) ডিস্কস্টোরের সাথে ehcache প্রয়োগ করার জন্য সিরিয়ালাইজেবল প্রয়োজন, অন্যথায় ক্যাশে ব্যর্থ হবে ( NotSerializableException) ডিস্ক ক্যাশে সত্তাটি লিখতে।


0

আপনি যখন em.find () অর্থাত্ (আইডিটির পরিবর্তে সত্তাটি নিজেই পাস করছেন) এর মতো কিছুতে ভুলভাবে টাইপ করা আইডি দ্বিতীয় পরম হিসাবে পাস করার সময় এটি ত্রুটিও ছুঁড়ে দেওয়া হয়। আমি আসলে জেপিএ সত্তাগুলিকে সিরিয়ালিয়াল হিসাবে ঘোষণা করার প্রয়োজনীয়তা পাইনি - আপনি আমান দ্বারা বর্ণিত রেফারেন্সযুক্ত কলাম নাম ব্যবহার না করা অবধি এটি প্রয়োজনীয় নয়।


0

যখন JPA সত্তা দূরবর্তী EJB ক্রিয়াকলাপগুলির মাধ্যমে পরামিতি বা রিটার্ন মান হিসাবে ব্যবহৃত হয়

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