क्या कोई मुझे हाइबरनेट में @MapsId समझा सकता है?


81

क्या कोई मुझे @MapsIdहाइबरनेट में समझा सकता है ? मुझे इसे समझने में कठिन समय लग रहा है।

यह बहुत अच्छा होगा यदि कोई इसे एक उदाहरण के साथ समझा सके और यह किस तरह के उपयोग के मामलों में लागू हो?

जवाबों:


47

यहाँ ऑब्जेक्ट डीबी से एक अच्छी व्याख्या है ।

एक ManyToOne या OneToOne संबंध विशेषता को डिजाइन करता है जो एंबेडेडआईड प्राथमिक कुंजी के लिए मैपिंग प्रदान करता है, एंबेडेडआईड प्राथमिक कुंजी के भीतर एक विशेषता या मूल इकाई की एक साधारण प्राथमिक कुंजी। मूल्य तत्व एक समग्र कुंजी के भीतर विशेषता को निर्दिष्ट करता है जिससे संबंध विशेषता मेल खाती है। यदि इकाई की प्राथमिक कुंजी उसी जावा प्रकार की है जो संबंध द्वारा संदर्भित इकाई की प्राथमिक कुंजी के रूप में है, तो मूल्य विशेषता निर्दिष्ट नहीं है।

// parent entity has simple primary key

@Entity
public class Employee {
   @Id long empId;
   String name;
   ...
} 

// dependent entity uses EmbeddedId for composite key

@Embeddable
public class DependentId {
   String name;
   long empid;   // corresponds to primary key type of Employee
}

@Entity
public class Dependent {
   @EmbeddedId DependentId id;
    ...
   @MapsId("empid")  //  maps the empid attribute of embedded id
   @ManyToOne Employee emp;
}

यहां एपीआई डॉक्स पढ़ें ।


6
लेकिन इसके बारे में क्या अच्छा है? @MapsId के बिना भी, JoinColumn का उपयोग उसी प्रभाव के लिए किया जा सकता है, क्या वह नहीं कर सकता है? और यदि हां, तो यह उदाहरण वास्तव में यह नहीं बताता है कि यह एनोटेशन वास्तव में किसके लिए अच्छा है।
मकसीम गुमेरोव

2
चूँकि दोनों इकाइयाँ एक ही प्राथमिक कुंजी को साझा कर रही होंगी, @MapsIdवसीयत परत (डेटाबेस) में वसीयत द्वारा निर्दिष्ट कॉलम के साथ इकाई में केवल प्राथमिक कॉलम कॉलम होगा। विचार दो संस्थाओं के बीच प्राथमिक कुंजी साझा करने का है।
जोहनवन्हेड

एंबेडेडआईड प्राथमिक कुंजी क्या है? यह सामान्य प्राथमिक कुंजी से कैसे भिन्न है?
sofs1

"मूल्य तत्व एक समग्र कुंजी के भीतर विशेषता को निर्दिष्ट करता है जिससे संबंध विशेषता मेल खाती है।" 1) मूल्य तत्व का क्या मतलब है, कृपया एक उदाहरण दें? 2) एक समग्र कुंजी क्या है? 3) संबंध विशेषता क्या है और एक उदाहरण दें?
sofs1

@MaksimGumerov यह कुशल है क्योंकि आप Dependentकेवल पहचानकर्ता को जानकर प्राप्त कर सकते हैं Employee
इमैनुएल ओसिमोसु

26

मुझे यह नोट भी उपयोगी लगा: @MapsIdहाइबरनेट एनोटेशन में एक कॉलम दूसरे टेबल के कॉलम से मिलता है।

इसका उपयोग 2 टेबल के बीच एक ही प्राथमिक कुंजी को साझा करने के लिए भी किया जा सकता है।

उदाहरण:

@Entity
@Table(name = "TRANSACTION_CANCEL")
public class CancelledTransaction {
    @Id
    private Long id; // the value in this pk will be the same as the
                     // transaction line from transaction table to which 
                     // this cancelled transaction is related

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_TRANSACTION", nullable = false)
    @MapsId
    private Transaction transaction;
    ....
}

@Entity
@Table(name = "TRANSACTION")
@SequenceGenerator(name = "SQ_TRAN_ID", sequenceName = "SQ_TRAN_ID")
public class Transaction  {
    @Id
    @GeneratedValue(generator = "SQ_TRAN_ID", strategy = GenerationType.SEQUENCE)
    @Column(name = "ID_TRANSACTION", nullable = false)
    private Long id;
    ...
}

मैं एक द्विदिश संघ में @MapsId कहां डालूं? क्या दोनों वर्गों के पास होना चाहिए @MapsId। क्या इससे भी कोई फर्क पड़ता है?
marcus

मुझे लगता है कि एक मेज मूल पीके (के साथ एक के "मालिक" हो जाएगा @Idऔर @GeneratedValueऔर @Column) और एक है @OneToOneऔर @JoinColumnअन्य की मेज के साथ, और अन्य तालिका होगा @MapsId। हालाँकि यह संभवत: तब काम नहीं करेगा जब आप पहले 'अन्य तालिका' में सम्मिलित करना चाहते थे।
22

1
उपयोग के इस तरह के बारे में अच्छा लेख (अन्य संस्था की आईडी के रूप में एक और मेज से आईडी का उपयोग कर) यहाँ है vladmihalcea.com/...
Lubo

लेकिन अगर आप रद्द किए गए लोगों से लेनदेन को फ़िल्टर करना चाहते हैं .. जो एक सामान्य कारण है। यह अधिक कुशल कैसे है? मेरा मतलब है कि SQL के लिए आपको सिर्फ TRANSACTION.fk_cancelled_id के लिए NULL नहीं कहना है, लेकिन इस मामले में, अधिक संचालन होगा।
M_F

यहां इस विशिष्ट मामले में, आधार वर्ग और तालिका में 'प्रकार' जैसे कॉलम का उपयोग करना आम है, जहां आप पहचानेंगे कि क्या लेनदेन प्रकार 'रद्द' या अन्य है।
टॉन्सिक

3

जैसा कि उन्होंने व्लादिमीर को अपने ट्यूटोरियल में समझाया , @OneToOne रिश्ते को मैप करने का सबसे अच्छा तरीका @MapsId का उपयोग करना है। इस तरह, आपको किसी द्विदिश संघ की भी आवश्यकता नहीं है क्योंकि आप मूल इकाई पहचानकर्ता का उपयोग करके हमेशा बाल इकाई ला सकते हैं।


2

MapsId आपको दो अलग-अलग संस्थाओं / तालिकाओं के बीच एक ही प्राथमिक कुंजी का उपयोग करने देता है। नोट: जब आप MapsId का उपयोग करते हैं, तो CASCADE.ALLध्वज बेकार हो जाता है, और आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपकी इकाइयां मैन्युअल रूप से सहेजी गई हैं।


1

IMHO के बारे @MapsIdमें सोचने का सबसे अच्छा तरीका यह है कि जब आपको a: m एंटिटी में कंपोजिट की को मैप करना हो।

उदाहरण के लिए, एक ग्राहक के पास एक या अधिक सलाहकार हो सकते हैं और एक सलाहकार के पास एक या अधिक ग्राहक हो सकते हैं:

यहाँ छवि विवरण दर्ज करें

और आपका प्रवेश कुछ इस तरह होगा (छद्म जावा कोड):

@Entity
public class Customer {
   @Id
   private Integer id;

   private String name;
}

@Entity
public class Consultant {
   @Id
   private Integer id;

   private String name;

   @OneToMany
   private List<CustomerByConsultant> customerByConsultants = new ArrayList<>();

   public void add(CustomerByConsultant cbc) {
      cbc.setConsultant(this);
      this.customerByConsultant.add(cbc);
   }
}

@Embeddable
public class ConsultantByConsultantPk implements Serializable {

    private Integer customerId;

    private Integer consultantId;
}

@Entity
public class ConsultantByConsultant {

   @EmbeddedId
   private ConsultantByConsultantPk id = new ConsultantByConsultantPk();

   @MapsId("customerId")
   @JoinColumn(insertable = false, updatable = false)
   Customer customer;

   @MapsId("consultantId")
   @JoinColumn(insertable = false, updatable = false)
   Consultant consultant;
}

इस तरह से मैपिंग करते हुए, जब भी आप एक सलाहकार को बचाते हैं , जेपीए स्वचालित रूप से सम्मिलित करता है Customerऔर Consultantआईडी करता है EmbeddableId। इसलिए आपको मैन्युअल रूप से बनाने की आवश्यकता नहीं है ConsultantByConsultantPk

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