নিখুঁত জেপিএ সত্তা তৈরি করুন [বন্ধ]


422

আমি জেপিএ (বাস্তবায়ন হাইবারনেট) এর সাথে কিছু সময়ের জন্য কাজ করছি এবং প্রতিবার যখন সত্ত্বা তৈরি করতে হবে তখন আমি নিজেকে অ্যাক্সেসটাইপ, অপরিবর্তনীয় বৈশিষ্ট্য, সমান / হ্যাশকোড, ... হিসাবে সমস্যা নিয়ে লড়াই করতে দেখি।
সুতরাং আমি প্রতিটি ইস্যুর জন্য সাধারণ সেরা অনুশীলনটি চেষ্টা করার চেষ্টা করব এবং এটি ব্যক্তিগত ব্যবহারের জন্য লিখে রাখব 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

}

এই তালিকায় যুক্ত করার জন্য অন্যান্য পরামর্শগুলি স্বাগত হওয়ার চেয়ে আরও বেশি ...

হালনাগাদ

এই নিবন্ধটি পড়ার পর থেকে আমি একা / এইচসি বাস্তবায়নের আমার পদ্ধতিটি মানিয়ে নিয়েছি:

  • যদি একটি অপরিবর্তনীয় সহজ ব্যবসায়িক কী উপলব্ধ থাকে: এটি ব্যবহার করুন
  • অন্যান্য সমস্ত ক্ষেত্রে: একটি ইউইড ব্যবহার করুন

6
এটি কোনও প্রশ্ন নয়, এটি তালিকার অনুরোধ সহ পর্যালোচনা করার অনুরোধ। তদুপরি, এটি খুব খোলা সমাপ্ত এবং অস্পষ্ট, বা অন্যভাবে বলা যায়: একটি জেপিএ সত্তা নিখুঁত কিনা তা কী ব্যবহার করা হবে তার উপর নির্ভর করে। সত্তার ব্যবহারের সমস্ত সম্ভাব্য ব্যবহারে সত্তার প্রয়োজনীয় সমস্ত বিষয়গুলির তালিকা দেওয়া উচিত?
মেরিটন

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

আমি ক্ষেত্রগুলিও হতে চাই final(আপনার সেটটারদের বাদ দিয়ে বিচার করে, আমি অনুমান করব যে আপনিও করেন)।
শ্রীধর সারনোবাত

এটি চেষ্টা করে দেখতে হবে তবে আমি মনে করি না চূড়ান্তভাবে কাজ করবে যেহেতু হাইবারনেট এখনও সেই বৈশিষ্ট্যগুলিতে মান নির্ধারণ করতে সক্ষম হবে।
স্টিজন গিউকেনস

কোথা notNullথেকে আসে?
bruno

উত্তর:


73

আমি বেশ কয়েকটি মূল পয়েন্টগুলির উত্তর দেওয়ার চেষ্টা করব: এটি বেশ কয়েকটি বড় অ্যাপ্লিকেশন সহ দীর্ঘ হাইবারনেট / অধ্যবসায় অভিজ্ঞতা থেকে।

সত্তা শ্রেণি: সিরিয়ালাইজবল বাস্তবায়ন?

কী Serializable বাস্তবায়ন করা প্রয়োজন। যে স্টাফটি এইচটিটিপিএসশনে যেতে চলেছে, বা আরপিসি / জাভা ইই দ্বারা তারের মাধ্যমে প্রেরণ করা হবে, সিরিয়ালাইজেবল প্রয়োগ করতে হবে। অন্যান্য জিনিস: খুব বেশি না। কোনটি গুরুত্বপূর্ণ তা আপনার সময় ব্যয় করুন।

কনস্ট্রাক্টর: সত্তার সমস্ত প্রয়োজনীয় ক্ষেত্র সহ একটি কনস্ট্রাক্টর তৈরি করবেন?

অ্যাপ্লিকেশন লজিকের জন্য কনস্ট্রাক্টরগুলির কয়েকটি মাত্র সমালোচক "বিদেশী কী" বা "টাইপ / ধরনের" ক্ষেত্র থাকা উচিত যা সত্তাটি তৈরি করার সময় সর্বদা জানা যাবে। বাকিগুলিকে সেটারের পদ্ধতিগুলিতে কল করে সেট করা উচিত - এটি তাদের জন্য।

কনস্ট্রাক্টরগুলিতে বেশি ক্ষেত্র স্থাপন করা এড়িয়ে চলুন। কনস্ট্রাক্টরদের সুবিধাজনক হতে হবে এবং অবজেক্টটিকে বুনিয়াদি দেওয়া উচিত। নাম, প্রকার এবং / অথবা পিতা-মাতার সমস্ত সাধারণত কার্যকর।

OTOH যদি আবেদনের নিয়মগুলির (আজ) কোনও গ্রাহকের ঠিকানা থাকার প্রয়োজন হয় তবে সেটারের কাছে রেখে দিন। এটি একটি "দুর্বল নিয়মের" উদাহরণ। সম্ভবত পরের সপ্তাহে, আপনি বিশদ প্রবেশের স্ক্রিনে যাওয়ার আগে একটি গ্রাহক অবজেক্ট তৈরি করতে চান? নিজেকে ট্রিপ করবেন না, অজানা, অসম্পূর্ণ বা "আংশিকভাবে প্রবেশ করা" ডেটার জন্য সম্ভাবনা রেখে যান।

কনস্ট্রাক্টর: এছাড়াও, ব্যক্তিগত ডিফল্ট কনস্ট্রাক্টর প্যাকেজ?

হ্যাঁ, তবে প্যাকেজ ব্যক্তিগতের চেয়ে 'সুরক্ষিত' ব্যবহার করুন। সাবক্লাসিং স্টাফগুলি একটি সত্যিকারের ব্যথা হয় যখন প্রয়োজনীয় ইন্টার্নালগুলি দৃশ্যমান হয় না।

ক্ষেত্রসমূহ / বিষয়বস্তু

হাইবারনেট এবং উদাহরণের বাইরে থেকে 'সম্পত্তি' ক্ষেত্র অ্যাক্সেস ব্যবহার করুন। উদাহরণস্বরূপ, ক্ষেত্রগুলি সরাসরি ব্যবহার করুন। কারণ: হাইবারনেটের জন্য স্ট্যান্ডার্ড রিফ্লেকশন, সহজতম এবং সর্বাধিক প্রাথমিক পদ্ধতিটিকে কাজ করার অনুমতি দেয় allows

অ্যাপ্লিকেশনটিতে 'অপরিবর্তনীয়' ক্ষেত্রগুলির হিসাবে - হাইবারনেট এখনও এগুলি লোড করতে সক্ষম হতে হবে। অ্যাপ্লিকেশন কোডটিকে অযাচিত অ্যাক্সেস করা রোধ করতে আপনি এই পদ্ধতিগুলিকে 'ব্যক্তিগত' করার চেষ্টা করতে পারেন, এবং / অথবা এগুলিতে একটি টীকা রাখতে পারেন।

দ্রষ্টব্য: সমান () ফাংশন লেখার সময়, 'অন্যান্য' উদাহরণে মানের জন্য getters ব্যবহার করুন! অন্যথায়, আপনি প্রক্সি দৃষ্টান্তগুলিতে অদ্বিতীয় / খালি ক্ষেত্রগুলিকে আঘাত করবেন।

(হাইবারনেট) পারফরম্যান্সের জন্য সুরক্ষিত আরও ভাল?

অসম্ভাব্য।

সমান / হ্যাশকোড?

এটি সংরক্ষণের আগে সত্তাগুলির সাথে কাজ করার জন্য প্রাসঙ্গিক - যা একটি কাঁটাযুক্ত সমস্যা। হ্যাশিং / অপরিবর্তনীয় মূল্যগুলির সাথে তুলনা করা? বেশিরভাগ ব্যবসায়িক অ্যাপ্লিকেশনগুলিতে কোনও কিছুই নেই।

কোনও গ্রাহক ঠিকানা পরিবর্তন করতে পারেন, তাদের ব্যবসায়ের নাম পরিবর্তন করতে পারেন ইত্যাদি ইত্যাদি common সাধারণ নয়, তবে এটি ঘটে। যখন তথ্য সঠিকভাবে প্রবেশ করা হয়নি তখন সংশোধনগুলিও করা সম্ভব হয়।

সাধারণত যে কয়েকটি জিনিস অপরিবর্তনীয় রাখা হয় তা হ'ল প্যারেন্টিং এবং সম্ভবত টাইপ / কাইন্ড - সাধারণত ব্যবহারকারী এগুলি পরিবর্তনের পরিবর্তে রেকর্ডটি পুনরায় তৈরি করে। কিন্তু এগুলি স্বতন্ত্রভাবে সত্তাটি সনাক্ত করে না!

সুতরাং, দীর্ঘ এবং সংক্ষিপ্ত, দাবি করা "অপরিবর্তনীয়" ডেটা সত্যই নয়। প্রাথমিক কী / আইডি ক্ষেত্রগুলি সুনির্দিষ্ট উদ্দেশ্যে, যেমন গ্যারান্টিযুক্ত স্থায়িত্ব এবং অপরিবর্তনীয়তা সরবরাহের জন্য উত্পন্ন হয়।

ক) তুলনায় & হ্যাশিং এবং অনুরোধ-প্রক্রিয়াজাতকরণের কাজের পর্যায়গুলির জন্য আপনার পরিকল্পনা এবং বিবেচনা করা দরকার যখন ক) ইউআই থেকে "পরিবর্তিত / বাউন্ড ডেটা" নিয়ে কাজ করা হয় যদি আপনি "খুব বেশি পরিবর্তিত ক্ষেত্রগুলি" বা বিয়ের সাথে কাজ করে " সংরক্ষণ না করা ডেটা ", যদি আপনি আইডিতে তুলনা / হ্যাশ করেন।

সমান / হ্যাশকোড - যদি কোনও অনন্য ব্যবসায়ের কীটি উপলভ্য না হয় তবে অস্থায়ী অ-ইউআইডি ব্যবহার করুন যা সত্তা শুরু হওয়ার সাথে সাথে তৈরি করা হয়

হ্যাঁ, যখন প্রয়োজন হয় এটি একটি ভাল কৌশল। সচেতন থাকুন যে ইউআইডিগুলি নিখরচায় নয়, যদিও কর্মক্ষমতা অনুযায়ী - এবং ক্লাস্টারিং জিনিসগুলিকে জটিল করে তোলে।

সমান / হ্যাশকোড - সম্পর্কিত সংস্থাগুলি কখনই উল্লেখ করবেন না

"যদি সম্পর্কিত সত্তাকে (পিতামাতার সত্তার মতো) ব্যবসায়ের কী অংশ হওয়ার প্রয়োজন হয় তবে প্যারেন্ট আইডি (ম্যান্টিওঅন জয়েন্টক্লাম হিসাবে একই নাম সহ) সংরক্ষণের জন্য একটি সন্নিবেশযোগ্য, অ-আপডেটযোগ্য ক্ষেত্র যুক্ত করুন এবং এই আইডিটি সাম্যতা পরীক্ষায় ব্যবহার করুন "

ভাল পরামর্শ মত শোনাচ্ছে।

আশাকরি এটা সাহায্য করবে!


2
পুনঃ নির্মাণকারীগণ, আমি প্রায়শই কেবল শূন্য আরগ দেখতে পাই (অর্থাত্ কিছুই নয়) এবং কলিং কোডটিতে সেটারগুলির একটি দীর্ঘ দীর্ঘ তালিকা রয়েছে যা আমার কাছে কিছুটা অগোছালো বলে মনে হয়। বেশ কয়েকটি কনস্ট্রাক্টর রয়েছে যা আপনার প্রয়োজন অনুসারে কলিং কোডটিকে আরও সুসংহত করে তোলে?
হারিকেন

সম্পূর্ণরূপে মতামত, বিশেষ করে ctor সম্পর্কে। এর চেয়ে সুন্দর কোডটি কী? বিভিন্ন কেন্দ্রের একগুচ্ছ যা আপনাকে জানতে দেয় যে কোন (সংমিশ্রণ) মানগুলির একটি বুদ্ধিমান অবস্থা তৈরি করতে প্রয়োজন বা কোনও নো -আর্গ কর্টোর যা কোনও কিছুর সীমাবদ্ধতা দেয় না এবং কোন ক্রমে সেট করে এবং এটি ব্যবহারকারীর ভুলগুলির প্রবণতা ছেড়ে দেয়? ?
মোহামনাগ

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

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

@ থমাসডাব্লু যখন আমি আপনার অভিনব আমি বলতে চাইছি যে সমস্ত বাক্য ফিল্টার করে ফেলেছি তখন ব্যবহারকারী ইনপুট ব্যতীত আপনার মন্তব্যে কোনও তথ্য নেই। Part অংশটি, যেমনটি আমি আগেই বলেছিলাম, এটি ডিটিওগুলিতে করা হবে, সরাসরি সত্তায় নয়। আরও 50 বছরে কথা বলতে দেয় যে আপনি ফোলারের মতো ডিডিডি পিছনে যে বড় মনের অভিজ্ঞতা পেয়েছেন তার 5% হয়ে উঠতে পারেন! চিয়ার্স: ডি
মোহামনাগ

144

JPA 2.0 স্পেসিফিকেশন যে:

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

স্পেসিফিকেশনে সত্ত্বার জন্য সমান এবং হ্যাশকোড পদ্ধতিগুলির বাস্তবায়ন সম্পর্কে কোনও প্রয়োজনীয়তা নেই, কেবলমাত্র প্রাথমিক কী ক্লাস এবং মানচিত্র কীগুলির জন্য যতদূর আমি জানি।


13
সত্য, সমান, হ্যাশকোড, ... একটি জেপিএ প্রয়োজনীয়তা নয় তবে অবশ্যই প্রস্তাবিত এবং ভাল অনুশীলন হিসাবে বিবেচিত হয়।
স্টিজন গিউকেনস

6
@ দ্য স্টিজন ভাল, আপনি যদি সাম্যের জন্য পৃথক পৃথক সংস্থাগুলির তুলনা করার পরিকল্পনা না করেন তবে এটি সম্ভবত অপ্রয়োজনীয়। আপনি যখনই জিজ্ঞাসা করবেন সত্তা পরিচালককে প্রদত্ত সত্তার একই উদাহরণটি ফেরত দেওয়ার নিশ্চয়তা দেওয়া হয়। সুতরাং, আপনি যতদূর বুঝতে পেরেছি পরিচালিত সত্তাগুলির জন্য পরিচয়ের তুলনা দিয়ে আপনি ঠিকঠাক করতে পারেন। আপনি যে পরিস্থিতিগুলিতে এটিকে একটি ভাল অনুশীলন হিসাবে বিবেচনা করবেন সে সম্পর্কে আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন?
এডউইন ডালোরজো

2
আমি সর্বদা সমান / হ্যাশকোডের সঠিক প্রয়োগ করার চেষ্টা করি। জেপিএর জন্য প্রয়োজনীয় নয় তবে সত্ত্বা বা সেটগুলিতে যুক্ত হওয়ার সময় আমি এটি একটি ভাল অনুশীলন হিসাবে বিবেচনা করি। সত্ত্বাগুলি যখন সেটগুলিতে যুক্ত হবে কেবল তখনই সমান বাস্তবায়ন করার সিদ্ধান্ত নিতে পারলেও আপনি কি সর্বদা আগাম জানেন?
স্টিজন জিউকেনস

10
@ দ্য স্টিজন জেপিএ সরবরাহকারী নিশ্চিত করবে যে যে কোনও সময়ে প্রসঙ্গে একটি নির্দিষ্ট সত্তার কেবলমাত্র একটি উদাহরণ রয়েছে, সুতরাং আপনার সেটগুলিও সমান / হ্যাঁকোড প্রয়োগ না করে নিরাপদ থাকে, তবে আপনি কেবল পরিচালিত সত্তা ব্যবহার করেন। সত্তাগুলির জন্য এই পদ্ধতিগুলি প্রয়োগ করা অসুবিধা থেকে মুক্ত নয়, উদাহরণস্বরূপ, বিষয়টি সম্পর্কে এই হাইবারনেট নিবন্ধটি একবার দেখুন । আমার বক্তব্য, আপনি যদি কেবল পরিচালিত সংস্থাগুলি নিয়ে কাজ করেন তবে এগুলি ছাড়াই আপনি আরও ভাল, অন্যথায় খুব সতর্কতার সাথে বাস্তবায়ন সরবরাহ করুন।
এডউইন ডালোরজো

2
@ দ্য স্টিজন এটি ভাল মিশ্র পরিস্থিতি। আপনি প্রথমদিকে প্রস্তাবিত হিসাবে এটি একা / এইচসি বাস্তবায়নের প্রয়োজনীয়তার ন্যায্যতা প্রমাণ করেছেন কারণ সত্তা যদি একবার অধ্যবসায় স্তরের সুরক্ষা ত্যাগ করেন আপনি আর জেপিএ স্ট্যান্ডার্ড দ্বারা প্রয়োগ করা বিধিগুলিকে বিশ্বাস করতে পারবেন না। আমাদের ক্ষেত্রে, ডিটিও প্যাটার্নটি শুরু থেকেই স্থপতিভাবে প্রয়োগ করা হয়েছিল ly ডিজাইন করে আমাদের অধ্যবসায় এপিআই ব্যবসায়িক সামগ্রীর সাথে যোগাযোগের জন্য সর্বজনীন উপায় সরবরাহ করে না, কেবলমাত্র ডিটিও ব্যবহার করে আমাদের অধ্যবসায় স্তরটির সাথে যোগাযোগ করার জন্য একটি এপিআই API
এডউইন ডালোরজো

13

উত্তরগুলির সাথে আমার 2 সেন্ট যোগ করুন:

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

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


9

সত্তা ইন্টারফেস

public interface Entity<I> extends Serializable {

/**
 * @return entity identity
 */
I getId();

/**
 * @return HashCode of entity identity
 */
int identityHashCode();

/**
 * @param other
 *            Other entity
 * @return true if identities of entities are equal
 */
boolean identityEquals(Entity<?> other);
}

সমস্ত সত্তার জন্য বেসিক বাস্তবায়ন, সমান / হ্যাশকোড বাস্তবায়নকে সহজ করে তোলে:

public abstract class AbstractEntity<I> implements Entity<I> {

@Override
public final boolean identityEquals(Entity<?> other) {
    if (getId() == null) {
        return false;
    }
    return getId().equals(other.getId());
}

@Override
public final int identityHashCode() {
    return new HashCodeBuilder().append(this.getId()).toHashCode();
}

@Override
public final int hashCode() {
    return identityHashCode();
}

@Override
public final boolean equals(final Object o) {
    if (this == o) {
        return true;
    }
    if ((o == null) || (getClass() != o.getClass())) {
        return false;
    }

    return identityEquals((Entity<?>) o);
}

@Override
public String toString() {
    return getClass().getSimpleName() + ": " + identity();
    // OR 
    // return ReflectionToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
}

রুম সত্তা ইমপ্লিট:

@Entity
@Table(name = "ROOM")
public class Room extends AbstractEntity<Integer> {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@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;
}

public Integer getId(){
    return id;
}

public Building getBuilding() {
    return building;
}

public String getNumber() {
    return number;
}


public void setCapacity(Integer capacity) {
    this.capacity = capacity;
}

//no setters for number, building nor id
}

আমি জেপিএ সত্তার প্রতিটি ক্ষেত্রে ব্যবসায়িক ক্ষেত্রের ভিত্তিতে সত্তাগুলির সমতার তুলনা করার বিন্দু দেখতে পাচ্ছি না। এই জেপিএ সত্তাগুলি ডোমেন-চালিত সত্তাগুলির পরিবর্তে (এই কোড উদাহরণগুলির জন্য যা) এর পরিবর্তে ডোমেন-চালিত ভ্যালুঅবজেক্ট হিসাবে বিবেচিত হলে এটি এর চেয়ে বেশি ক্ষেত্রে হতে পারে।


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

2
সমান () এনপিই নিক্ষেপ করবে না কারণ সেখানে ডিবি আইডি নাল আছে কিনা তা যাচাই করা আছে এবং যদি ডিবি আইডি নাল হয় তবে সমতাটি মিথ্যা হবে।
আহামান

3
আসলে, আমি দেখতে পাচ্ছি না যে আমি কীভাবে মিস করেছি যে কোডটি নাল-নিরাপদ। তবে আইডি ব্যবহার করে আইএমও করা এখনও খারাপ অভ্যাস। যুক্তি: onjava.com/pub/a/onjava/2006/09/13/…
স্টিজন জিউকেনস

ভন ভার্ননের 'ইমপ্লিমেন্টিং ডিডিডি' বইয়ে যুক্তি দেওয়া হয়েছে যে আপনি "প্রারম্ভিক পিকে প্রজন্ম" ব্যবহার করেন (প্রথমে একটি আইডি উত্পন্ন করুন এবং এটি সত্তার নির্মাতাকে ডাটাবেস তৈরি করতে দেওয়ার বিপরীতে ব্যবহার করুন) আইডিটি যখন আপনি সত্তা অবিচল থাকেন))
উইম দেবলাওয়ে

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