क्या कोई मुझे @MapsId
हाइबरनेट में समझा सकता है ? मुझे इसे समझने में कठिन समय लग रहा है।
यह बहुत अच्छा होगा यदि कोई इसे एक उदाहरण के साथ समझा सके और यह किस तरह के उपयोग के मामलों में लागू हो?
क्या कोई मुझे @MapsId
हाइबरनेट में समझा सकता है ? मुझे इसे समझने में कठिन समय लग रहा है।
यह बहुत अच्छा होगा यदि कोई इसे एक उदाहरण के साथ समझा सके और यह किस तरह के उपयोग के मामलों में लागू हो?
जवाबों:
यहाँ ऑब्जेक्ट डीबी से एक अच्छी व्याख्या है ।
एक 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;
}
यहां एपीआई डॉक्स पढ़ें ।
@MapsId
वसीयत परत (डेटाबेस) में वसीयत द्वारा निर्दिष्ट कॉलम के साथ इकाई में केवल प्राथमिक कॉलम कॉलम होगा। विचार दो संस्थाओं के बीच प्राथमिक कुंजी साझा करने का है।
Dependent
केवल पहचानकर्ता को जानकर प्राप्त कर सकते हैं Employee
।
मुझे यह नोट भी उपयोगी लगा: @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
। क्या इससे भी कोई फर्क पड़ता है?
@Id
और @GeneratedValue
और @Column
) और एक है @OneToOne
और @JoinColumn
अन्य की मेज के साथ, और अन्य तालिका होगा @MapsId
। हालाँकि यह संभवत: तब काम नहीं करेगा जब आप पहले 'अन्य तालिका' में सम्मिलित करना चाहते थे।
जैसा कि उन्होंने व्लादिमीर को अपने ट्यूटोरियल में समझाया , @OneToOne रिश्ते को मैप करने का सबसे अच्छा तरीका @MapsId का उपयोग करना है। इस तरह, आपको किसी द्विदिश संघ की भी आवश्यकता नहीं है क्योंकि आप मूल इकाई पहचानकर्ता का उपयोग करके हमेशा बाल इकाई ला सकते हैं।
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
।