Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

JPA MySQLIntegrityConstraintViolationException में माता-पिता/बच्चे के परिणाम डालें

आपके रिश्ते को द्वि-दिशात्मक होने की आवश्यकता नहीं है। यहाँ टिप्पणियों में कुछ गलत जानकारी है।

आपने यह भी कहा था कि आपने चाइल्ड इकाई में "parentId" फ़ील्ड जोड़ा था क्योंकि आपने माना था कि JPA को मूल फ़ील्ड के बारे में "जानना" चाहिए ताकि वह मान सेट कर सके। समस्या यह नहीं है कि जेपीए आपके द्वारा प्रदान की गई टिप्पणियों के आधार पर फ़ील्ड के बारे में नहीं जानता है। समस्या यह है कि आपने क्षेत्र के बारे में "बहुत अधिक" जानकारी प्रदान की है, लेकिन वह जानकारी आंतरिक रूप से सुसंगत नहीं है।

माता-पिता में अपना फ़ील्ड और एनोटेशन बदलें:

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "parent_id")
private List<Child> children;

फिर चाइल्ड इकाई से "parentId" को पूरी तरह से हटा दें। आपने पहले एक JoinTable एनोटेशन निर्दिष्ट किया था। हालांकि, आप जो चाहते हैं वह जॉइनटेबल नहीं है। एक जॉइनटेबल दो संस्थाओं को एक दूसरे से जोड़ने के लिए एक अतिरिक्त तीसरी तालिका बनाएगा। आप जो चाहते हैं वह केवल एक JoinColumn है। एक बार जब आप किसी फ़ील्ड में JoinColumn एनोटेशन जोड़ते हैं, जिसे OneToMany के साथ भी एनोटेट किया जाता है, तो आपके JPA कार्यान्वयन को पता चल जाएगा कि आप CHILD तालिका में FK जोड़ रहे हैं। समस्या यह है कि जेपीए में पहले से ही एक कॉलम parent_id के साथ परिभाषित एक चाइल्ड टेबल है।

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

मैंने आपके कोड को ऊपर वर्णित परिवर्तनों के साथ संशोधित किया है, और मैंने "मर्ज" के बजाय "पर्सिस्ट" भी कहा है।

इसके परिणामस्वरूप 3 SQL क्वेरीज़ हुईं

insert into PARENT (ID) values (default)
insert into CHILD (ID) values (default)
update CHILD set parent_id=? where ID=?

यह दर्शाता है कि आप पूरी तरह से क्या चाहते हैं। PARENT प्रविष्टि बनाई गई है। CHILD प्रविष्टि बनाई जाती है, और फिर CHILD रिकॉर्ड को विदेशी कुंजी को सही ढंग से सेट करने के लिए अद्यतन किया जाता है।

यदि आप इसके बजाय एनोटेशन जोड़ते हैं

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(name = "parent_id", nullable = false)
private List<Child> children;

फिर जब यह बच्चे को सम्मिलित करता है तो यह निम्न क्वेरी चलाएगा

insert into CHILD (ID, parent_id) values (default, ?)

इस प्रकार शुरू से ही अपने FK को ठीक से सेट करना।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Group_Concat रिपीटिंग वैल्यूज

  2. एसक्यूएल क्वेरी का उपयोग कर तालिका में अंतिम पंक्ति हटाएं?

  3. SQL - उन पंक्तियों का चयन करें जिनका दो स्तंभों में समान मान है

  4. PHP जांचें कि क्या स्ट्रिंग में एक अक्षर है

  5. क्या Django ORM किसी कॉलम के विशिष्ट मान पर ORDER BY कर सकता है?