JPA में कंपोजिट प्राइमरी की को कैसे बनाएं और हैंडल करें


108

मैं उसी डेटा प्रविष्टि से संस्करण रखना चाहता हूं। दूसरे शब्दों में, मैं एक और संस्करण संख्या के साथ प्रविष्टि की नकल करना चाहता हूं।

id - Version प्राथमिक कुंजी होगी।

इकाई कैसे दिखना चाहिए? मैं इसे दूसरे संस्करण के साथ कैसे डुप्लिकेट कर सकता हूं?

id Version ColumnA

1   0      Some data
1   1      Some Other data
2   0      Data 2. Entry
2   1      Data

@IdClassएनोटेशन का उपयोग करते समय , मैंने पाया कि एक और टिप @Columnएनोटेशन को इकाई वर्ग के क्षेत्रों ( YourEntityरोहितजन के नमूना कोड में) में जाना चाहिए ।
केनएसवी ३०'१

जवाबों:


231

आप एक बना सकते हैं Embedded class, जिसमें आपकी दो चाबियां हैं, और फिर उस वर्ग का संदर्भ EmbeddedIdआपके अनुसार है Entity

आप की आवश्यकता होगी @EmbeddedIdऔर @Embeddableएनोटेशन।

@Entity
public class YourEntity {
    @EmbeddedId
    private MyKey myKey;

    @Column(name = "ColumnA")
    private String columnA;

    /** Your getters and setters **/
}
@Embeddable
public class MyKey implements Serializable {

    @Column(name = "Id", nullable = false)
    private int id;

    @Column(name = "Version", nullable = false)
    private int version;

    /** getters and setters **/
}

इस कार्य को प्राप्त करने का एक और तरीका है @IdClassएनोटेशन का उपयोग करना , और idउस में अपने दोनों को जगह देना IdClass। अब आप @Idदोनों विशेषताओं पर सामान्य एनोटेशन का उपयोग कर सकते हैं

@Entity
@IdClass(MyKey.class)
public class YourEntity {
   @Id
   private int id;
   @Id
   private int version;

}

public class MyKey implements Serializable {
   private int id;
   private int version;
}

4
क्या यह @Generatedvalue
एंबेडेडआईड

1
@Kayser। जहाँ तक मुझे पता है। नहीं, आपको अपने KeyClass उदाहरण में उनके लिए मूल्य स्पष्ट रूप से निर्धारित करना होगा, और फिर उस मुख्य वर्ग उदाहरण को अपने Entity में सेट करना होगा।
रोहित जैन

@Kayser। @GeneratedValueइसका उपयोग केवल प्राथमिक कुंजी के लिए मुख्य मान उत्पन्न करने के लिए किया जा सकता है, यह समग्र कुंजियों के लिए संयोजन उत्पन्न नहीं कर सकता है।
रोहित जैन

1
@RohitJain सिर्फ एक चीज़: आप वास्तव में एम्बेडेड क्लास को सार्वजनिक नहीं कर सकते (सार्वजनिक होने के लिए इसकी अपनी फ़ाइल में होना आवश्यक है)
लुकास

1
@FastEngy इसे अभी भी वेकबैक मशीन के माध्यम से एक्सेस किया जा सकता है: web.archive.org/web/20170123035517/http://uaihebert.com/… । ऐसा लगता है कि इस लेख को web.archive.org/web/20170202203555/http://uaihebert.com/… और web.archive.org/web/20161014051056/http theuaihebert.com/ ... द्वारा सुपरक्यूट किया गया है, जो गायब भी हो गया है। …
रेडलन

9

Serializableयदि आप उपयोग कर रहे हैं तो MyKey वर्ग को लागू करना चाहिए@IdClass


5

मुख्य वर्ग:

@Embeddable
@Access (AccessType.FIELD)
public class EntryKey implements Serializable {

    public EntryKey() {
    }

    public EntryKey(final Long id, final Long version) {
        this.id = id;
        this.version = version;
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getVersion() {
        return this.version;
    }

    public void setVersion(Long version) {
        this.version = version;
    }

    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof EntryKey))
            return false;
        EntryKey castOther = (EntryKey) other;
        return id.equals(castOther.id) && version.equals(castOther.version);
    }

    public int hashCode() {
        final int prime = 31;
        int hash = 17;
        hash = hash * prime + this.id.hashCode();
        hash = hash * prime + this.version.hashCode();
        return hash;
    }

    @Column (name = "ID")
    private Long id;
    @Column (name = "VERSION")
    private Long operatorId;
}

इकाई वर्ग:

@Entity
@Table (name = "YOUR_TABLE_NAME")
public class Entry implements Serializable {

    @EmbeddedId
    public EntryKey getKey() {
        return this.key;
    }

    public void setKey(EntryKey id) {
        this.id = id;
    }

    ...

    private EntryKey key;
    ...
}

मैं इसे दूसरे संस्करण के साथ कैसे डुप्लिकेट कर सकता हूं?

आप इकाई को अलग कर सकते हैं जो प्रदाता से पुनर्प्राप्त किया गया है, प्रविष्टि की कुंजी को बदल दें और फिर इसे एक नई इकाई के रूप में बनाए रखें।


आईट्री में आईडी को परिभाषित करना संभव है AUTOGENERATED। ओडर कुछ इस तरह से @GeneratedValue(strategy = GenerationType.IDENTITY)
Kayser

1
मैं यह भी सोच रहा हूं कि 2 लंबे प्राथमिक कुंजी के लिए हैश की गणना कैसे करें। के रूप में hashऔर primeविधि में hashCodeकक्षा में EntryKey, क्या आप मुझे बता सकते हैं, जहां उस विचार से आता है?
ब्रूस सन

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.