javatpoint - hibernate meaning



डेटा सहेजा नहीं गया था: ऑब्जेक्ट बिना सहेजे गए क्षणिक उदाहरण का संदर्भ देता है-फ्लशिंग से पहले क्षणिक उदाहरण को बचाएं (4)

आप चीजों को सीतनिद्रा में डालने के लिए नहीं सहेज सकते जब तक कि आपने इस नए सहेजे गए ऑब्जेक्ट द्वारा संदर्भित सभी अन्य ऑब्जेक्ट्स के बारे में सीतनिद्रा में नहीं बताया। तो इस मामले में, आप एक User बारे में सीतनिद्रा में कथित तौर पर कह रहे हैं, लेकिन उसने Country बारे में यह नहीं बताया है

आप दो तरह से इस तरह की समस्याओं को हल कर सकते हैं।

मैन्युअल

User बचाने से पहले session.save(country) कॉल करें

CascadeType

आप सीतनिद्रा में निर्दिष्ट करने के लिए निर्दिष्ट कर सकते हैं कि इस रिश्ते को कास्केडटाइप का उपयोग करते हुए कुछ कार्यों का प्रचार करना चाहिए। इस मामले में कैसकेड टाइप। पेर्सआईस्ट काम करेगा, जैसा कि कैस्केड टाइप।

मौजूदा देशों को संदर्भित करना

@ ज़ोरोकुल के उत्तर के आधार पर आपके पास दूसरी समस्या है, जो कि जब आपके पास एक ही Country साथ दो User ऑब्जेक्ट हैं, तो आप सुनिश्चित नहीं कर रहे हैं कि यह वही Country । ऐसा करने के लिए, आपको डेटाबेस से उचित Country प्राप्त करना होगा, इसे नए उपयोगकर्ता पर सेट करना होगा, और फिर User बचाएं। उसके बाद, आपके दोनों User ऑब्जेक्ट्स उसी Country उल्लेख करेंगे, न कि सिर्फ दो Country उदाहरण हैं जो समान नाम हैं। मौजूदा उदाहरणों को लाने का एक तरीका Criteria एपीआई की समीक्षा करें।

https://src-bin.com

मेरे पास दो तालिकाओं वाला उपयोगकर्ता और देश है मैं उन रिश्तेना चाहता हूं जहां कई उपयोगकर्ता एक काउंटी से संबंधित हो सकते हैं। मैं निम्न मॉडल वर्गों का प्रयोग करके हाइबरनेट का उपयोग करके इसे लागू करता हूं:

@Entity (name = "user")
public class User {

   @Id @GeneratedValue (strategy = GenerationType.IDENTITY)
    private int userId;
    private String username;
    private String password;

   @ManyToOne ()
   @JoinColumn (name = "countryId")
   private Country country;

    //Getter & Setter
 }


@Entity (name = "country")
public class Country {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int countryId;
    private String countryName;
   //Getter & Setter
}

जब मैं उपयोगकर्ता ऑब्जेक्ट को सहेजने की कोशिश करता हूं तो मुझे निम्नलिखित अपवाद मिलता है:

  org.hibernate.HibernateException: Data was not saved: object references an unsaved transient instance - save the transient instance before flushing: com.kyrogaming.models.Country

मैं इस समस्या को कैसे ठीक कर सकता हूं?


Answer #1

ऐसा लगता है कि आपके देश के ऑब्जेक्ट में जोड़े गए उपयोगकर्ता डीबी में मौजूद नहीं हैं। आपको यह सुनिश्चित करने के लिए झरना का उपयोग करना होगा कि जब देश कायम रहे, सभी उपयोगकर्ता जो आंकड़ों में नहीं हैं, लेकिन देश के साथ जुड़े हुए हैं, वे लगातार बने रहते हैं।

नीचे कोड को मदद करनी चाहिए:

@ManyToOne (cascade = CascadeType.ALL)
   @JoinColumn (name = "countryId")
   private Country country;

Answer #2

ठीक है अगर आपने दिया है

@ManyToOne ()
   @JoinColumn (name = "countryId")
   private Country country;

तब उस वर्ग के उद्देश्य का मतलब है कि देश को पहले से बचाना होगा

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

इसलिए इसके लिए आपको उस देश को पहले तालिका में सहेजना होगा।


Answer #3

मुझे भी यही समस्या थी। मेरे मामले में यह उठता है, क्योंकि लुकअप-टेबल "देश" में देश आईडी == 0 और एक प्रारंभिक प्राथमिक कुंजी के साथ एक मौजूदा रिकॉर्ड है और मैं देश आईडी == 0 के साथ एक उपयोगकर्ता को सहेजने का प्रयास करता हूं देश की प्राथमिक कुंजी को पूर्णांक में बदलें अब सीतनिद्रा में होना नए रिकॉर्ड की पहचान कर सकता है।

प्राथमिक कुंजी के रूप में आवरण वर्गों का उपयोग करने की सिफारिश के लिए, यह स्टैक ओवरफ्लो प्रश्न देखें





hibernate