hibernate - मॉडल वर्गों में javafx.beans गुणों का उपयोग करना





model persistence (4)


जेपीए संग्रहों के लिए बस गेटटर विधि के लिए इस हस्ताक्षर का उपयोग करें ..

@OneToMany
List<Person> getAll()
{
return observableList;
}

मॉडल वर्गों में जावाएफएक्स बीन्स गुणों का उपयोग करने के लिए यह सही अभ्यास है?

मुझे आश्चर्य है कि मॉडल वर्गों में गुणों का उपयोग करने के लिए यह एक अच्छा अभ्यास है ताकि वे दृश्य घटकों के साथ उन्हें बाध्य कर सकें। मैं भविष्य में उन पुस्तकालयों की उपलब्धता के बारे में चिंतित नहीं हूं क्योंकि मेरा कार्यक्रम जेआरई 8 या बाद में चलाया जाएगा लेकिन मॉडल कक्षाओं में जावाएफएक्स पुस्तकालयों का उपयोग करने की प्रकृति मुझे संदेहजनक बनाती है और मैं विशेष रूप से वर्तमान और भविष्य की अक्षमताओं के बारे में चिंतित हूं क्योंकि मैं उन विशेषताओं को बनाए रखने के लिए हाइबरनेट का उपयोग करना चाहता हूं।

नोट: मैं एक शुद्ध जावाएफएक्स पर्यावरण का उपयोग करता हूं और मुझे अपने आवेदन में स्विंग कॉम्पेबिलिटी की आवश्यकता नहीं होगी।




जावाएफएक्स संपत्ति डिजाइन

जावाएफएक्स गुण इस प्रकार डिज़ाइन किए गए हैं कि आपको उनका उपयोग करने के लिए जावाएफएक्स प्रोग्राम चलाने की आवश्यकता नहीं है। जावाएफएक्स प्रॉपर्टीज और बाइंडिंग ट्यूटोरियल का उपयोग करते हुए ओरेकल के अनुभाग, इस तरह के उपयोग को प्रदर्शित करते हैं (उदाहरण के लिए बिल के गुणों को मॉडल करने के लिए एक बिल क्लास)। ट्यूटोरियल से नमूना सिर्फ एक मानक जावा प्रोग्राम चलाता है जिसमें जावाफैक्स एप्लीकेशन नहीं है। तो आप JavaFX रनटाइम पर अतिरिक्त आवश्यकता के बिना सामान्य रूप से गुणों और बाध्यकारी का उपयोग कर सकते हैं। इसका मतलब है कि आप उदाहरण के लिए, सर्वर पक्ष अनुप्रयोग में जावाएफएक्स गुणों और बाइंडिंग का उपयोग कर सकते हैं।

"सही" व्यवहार

ठीक है, तो आप इसे कर सकते हैं, लेकिन क्या यह "सही" अभ्यास है?

मुझे नहीं लगता कि बहुत से लोग इस तरह जावाएफएक्स गुणों का उपयोग करते हैं। इसका एक कारण बस इसलिए है क्योंकि जावाएफएक्स गुण काफी नए हैं। मुझे नहीं लगता कि यह मॉडल ऑब्जेक्ट्स में जावाएफएक्स गुणों का उपयोग करने के लिए "गलत" है।

चेतावनियां

जावाएफएक्स गुण जावा क्रमबद्धता का समर्थन नहीं करते हैं (इसके द्वारा मेरा मतलब है Serializable इंटरफ़ेस के लिए प्रत्यक्ष समर्थन)। कई सर्वर पक्ष जावा प्रौद्योगिकियों को मॉडल क्रमिकरण की आवश्यकता हो सकती है और वे किसी भी ऑब्जेक्ट को क्रमबद्ध करने में असमर्थ होंगे जो JavaFX गुणों का उपयोग करता है।

जावाएफएक्स गुण स्वयं कंटेनर के बारे में जागरूक नहीं हैं और साइड इफेक्ट्स के माध्यम से काम करते हैं (उदाहरण के लिए एक संपत्ति बदलना किसी अन्य बाध्य मूल्य पर अपडेट ट्रिगर कर सकता है), इसलिए इस बारे में जागरूक रहें और सुनिश्चित करें कि इस तरह की प्रसंस्करण आपके पर्यावरण में एक स्वीकार्य दृष्टिकोण है। विशेष रूप से, सावधान रहें कि आप बहु-थ्रेडेड सर्वर वातावरण में अवांछित दौड़ की स्थिति उत्पन्न नहीं करते हैं (जावाएफएक्स क्लाइंट अनुप्रयोगों को आम तौर पर जावाफ़ैक्स के रूप में सामान्य रूप से एक थ्रेडेड वातावरण के रूप में चलाने के लिए कम देखभाल की आवश्यकता होती है)।

जावाएफएक्स गुण और हाइबरनेट / जेपीए

मुझे नहीं लगता कि जावाफैक्स गुणों को हाइबरनेट (या जेपीए) इकाई वर्गों में मिलाकर एक अच्छा विचार है। मैंने किसी को ऐसा नहीं देखा है। खुद को हाइबरनेट स्वयं जावाएफएक्स गुणों से अवगत नहीं है और सामान्य रूप से स्ट्रिंग्स और इन्ट्स जैसे जावा प्राइमेटिव्स के खिलाफ काम करने के लिए डिज़ाइन किया गया है, इसलिए मुझे नहीं पता कि यह संभवतः जावाफ़ैक्स प्रॉपर्टी को डेटाबेस फ़ील्ड में कैसे मैप कर सकता है।

आपको संभवतः एक सेटअप की आवश्यकता होगी जो आपकी इकाई वर्ग पदानुक्रम और आपके जावाएफएक्स संपत्ति आधारित मॉडल कक्षाओं के लिए समानांतर पदानुक्रम परिभाषित करे और आखिरकार एक मैपर परत जो दोनों के बीच मैप की गई हो। इस प्रकार का वास्तुशिल्प सेटअप अनिवार्य रूप से एक एमवीवीएम मॉडल है । मॉडल (एम) आपकी हाइबरनेट इकाई वर्ग है, और दृश्य मॉडल (वीएम) आपका जावाएफएक्स संपत्ति आधारित मॉडल है।




मैं यहाँ एक असंतोषजनक राय की पेशकश करने जा रहा हूँ।

जावाएफएक्स गुण और जेपीए

जैसा कि मैंने गहने के जवाब पर टिप्पणी की, जेपीए के साथ जावाएफएक्स प्रॉपर्टी-आधारित बीन का उपयोग करना तब तक संभव है जब तक आप "फील्ड एक्सेस" के बजाय "संपत्ति एक्सेस" का उपयोग न करें। मैंने जिस ब्लॉग पोस्ट को लिंक किया है, उस पर अधिक जानकारी get...() , लेकिन बुनियादी विचार यह है कि किसी भी टिप्पणी को get...() विधियों पर होना चाहिए और फ़ील्ड पर नहीं होना चाहिए। जहां तक ​​मैं देख सकता हूं, यह जेपीए के साथ-साथ पढ़ने के लिए केवल पढ़ने वाले जावाएफएक्स संपत्ति पैटर्न के उपयोग को रोकता है, लेकिन मैंने कभी भी महसूस नहीं किया है कि जेपीए ने केवल पढ़ने वाले गुणों (यानी विधियों और कोई सेट विधि नहीं) के साथ अच्छी तरह से खेला है ।

क्रमबद्धता

गहने के जवाब पर मेरी टिप्पणी के विपरीत, और इसके साथ काम करने के लिए कुछ हफ्तों के लाभ के साथ (और ऐसी स्थिति में रखा गया जहां मुझे JavaFX गुणों का उपयोग कर जावाएफएक्स क्लाइंट पक्ष पर कई इकाई वर्गों की प्रतिलिपि बनाने का सामना करना पड़ रहा था), मुझे लगता है कि कमी JavaFX गुणों के क्रमिकरण के आसपास काम किया जा सकता है। मुख्य अवलोकन यह है कि आपको वास्तव में केवल संपत्ति की लिपटे स्थिति को क्रमबद्ध करने की आवश्यकता है (उदाहरण के लिए, कोई श्रोताओं नहीं)। आप java.io.Externalizable को लागू करके ऐसा कर सकते हैं। readExternal(...) Serializable का एक उप-इंटरफ़ेस है जिसके लिए आपको readExternal(...) writeExternal(...) और readExternal(...) writeExternal(...) विधियों को भरने की आवश्यकता होती है। इन विधियों को केवल संपत्ति के बजाय संपत्ति द्वारा लिपटे राज्य को बाहरी बनाने के लिए लागू किया जा सकता है। इसका मतलब यह है कि यदि आपकी इकाई धारावाहिक है और फिर deserialized है, तो आप एक नई संपत्ति के उदाहरण के साथ समाप्त हो जाएगा, और किसी भी श्रोताओं को संरक्षित नहीं किया जाएगा (यानी श्रोताओं प्रभावी रूप से transient बन जाते हैं), लेकिन जहां तक ​​मैं यह देख सकता हूं कि यह क्या होगा किसी भी उचित उपयोग मामले में चाहता था।

मैंने इस तरह से परिभाषित बीन्स के साथ प्रयोग किया और यह सब अच्छी तरह से काम करने लगता है। इसके अतिरिक्त, मैंने जैक्सन मैपर का उपयोग करके जेएसओएन प्रस्तुति में कनवर्ट करने के लिए क्लाइंट और एक आरामदायक वेब सेवा के बीच उन्हें स्थानांतरित करने में एक छोटा सा प्रयोग चलाया। चूंकि मैपर बस प्राप्त करने और सेट विधियों का उपयोग करने पर निर्भर करता है, यह ठीक काम करता है।

कुछ चेतावनी

कुछ बिंदुओं को देखा जाना चाहिए। किसी भी सीरियलाइजेशन के साथ, नो-तर्क कन्स्ट्रक्टर होना महत्वपूर्ण है। और निश्चित रूप से, जावाएफएक्स गुणों द्वारा लिपटे सभी मूल्यों को स्वयं क्रमबद्ध होना चाहिए - फिर यह किसी भी धारावाहिक बीन के लिए एक ही नियम है।

दुष्प्रभावों के माध्यम से काम कर रहे जावाएफएक्स गुणों के बारे में बिंदु अच्छी तरह से लिया जाता है, और इन गुणों को स्थानांतरित करते समय देखभाल की आवश्यकता होती है (जो कि कुछ हद तक, एक सिंगल थ्रेडेड मॉडल के साथ डिज़ाइन किया गया है) संभावित बहु-थ्रेडेड सर्वर पर। अंगूठे का एक अच्छा नियम शायद यह है कि यदि आप इस रणनीति का उपयोग करते हैं, तो श्रोताओं को केवल ग्राहक पक्ष पर पंजीकृत होना चाहिए (और याद रखें, उन श्रोताओं को सर्वर पर वापस स्थानांतरित करने के संबंध में क्षणिक होते हैं, चाहे क्रमबद्धता या JSON प्रतिनिधित्व द्वारा)। बेशक, यह सुझाव देता है कि सर्वर पक्ष पर इनका उपयोग करना एक खराब डिजाइन हो सकता है; यह एक ऐसी इकाई रखने की सुविधा के बीच एक व्यापार-बंद हो जाता है जो "सभी लोगों के लिए सभी चीजें" (जावाएफएक्स क्लाइंट के लिए अवलोकन योग्य गुण, दृढ़ता और / या दूरस्थ पहुंच के लिए क्रमिक, और जेपीए के लिए लगातार मैपिंग के साथ) कार्यक्षमता को उजागर करने के विरुद्ध (उदाहरण के लिए अवलोकन) जहां यह पूरी तरह से उपयुक्त नहीं हो सकता है (सर्वर पर)।

अंत में, यदि आप जेपीए एनोटेशन का उपयोग करते हैं, तो उनके पास रनटाइम प्रतिधारण होता है जो दर्शाता है (मुझे लगता है) कि आपके जावाएफएक्स क्लाइंट को क्लासपाथ पर एक javax.persistence विनिर्देश की आवश्यकता होगी)।

यहां "सभी मौसमों के लिए आदमी" इकाई का एक उदाहरण दिया गया है:

import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.time.MonthDay;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 * Entity implementation class for Entity: Person
 *
 */
@Entity

public class Person implements Externalizable {


    private static final long serialVersionUID = 1L;

    public Person() {

    }

    public Person(String name, MonthDay birthday) {
        setName(name);
        setBirthday(birthday);
    }

    private final IntegerProperty id = new SimpleIntegerProperty(this, "id");

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id.get();
    }

    public void setId(int id) {
        this.id.set(id);
    }

    public IntegerProperty idProperty() {
        return id ;
    }

    private final StringProperty name = new SimpleStringProperty(this, "name");

    // redundant, but here to indicate that annotations must be on the property accessors:
    @Column(name="name")
    public final String getName() {
        return name.get();
    }

    public final void setName(String name) {
        this.name.set(name);
    }

    public StringProperty nameProperty() {
        return name ;
    }

    private final ObjectProperty<MonthDay> birthday = new SimpleObjectProperty<>();

    public final MonthDay getBirthday() {
        return birthday.get();
    }

    public final void setBirthday(MonthDay birthday) {
        this.birthday.set(birthday);
    }

    public ObjectProperty<MonthDay> birthdayProperty() {
        return birthday ;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeInt(getId());
        out.writeObject(getName());
        out.writeObject(getBirthday());
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        setId(in.readInt());
        setName((String) in.readObject());
        setBirthday((MonthDay) in.readObject());
    }

}



जब तक विरासत प्रणाली पर काम करने की सीधी आवश्यकता नहीं होती है, तब तक जावा ईई मानक के नवीनतम संस्करण से शुरू करना बिल्कुल ठीक है।

स्टार्टर्स के लिए मैं आपको मार्टी हॉल द्वारा मुफ्त ट्यूटोरियल की सिफारिश करता हूं, विशेष रूप से अपाचे टॉमकैट को कॉन्फ़िगर और प्रयोग करने के लिए आपको ऊपर उठाने और चलाने के लिए।

एक आधिकारिक जावा ईई शुरुआती ट्यूटोरियल, जावा ईई 7 ट्यूटोरियल भी है । यह निश्चित रूप से लिखा गया है और इसमें कई उदाहरण हैं। इसके अंत तक, आपको एक बहुत अच्छा विचार होना चाहिए कि आगे कहाँ जाना है।







java hibernate javafx model persistence