मेरे ऐप में मेरे पास इन हाइबरनेट-मैप किए गए प्रकार (सामान्य मामले) हैं:जब मैं अद्यतन/सम्मिलित करने का प्रयास करता हूं तो हाइबरनेट को हटाने का प्रयास क्यों करता है?
class RoleRule {
private Role role;
private PermissionAwareEntity entity; // hibernate-mapped entity for which permission is granted
private PermissionType permissionType; // enum
@ManyToOne
@JoinColumn(name = "ROLE_ID")
public Role getRole() {
return role;
}
public void setRole(Role role) {
this.role = role;
}
}
class Role {
private Set<RoleRule> rules = new HashSet<RoleRule>(0);
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name="ROLE_ID")
public Set<RoleRule> getRules() {
return rules;
}
public void setRules(Set<RoleRule> rules) {
this.rules = rules;
}
}
सभी वर्गों में equals() & hashCode()
ओवरराइड हैं।
मेरा एप्लिकेशन भूमिकाओं के tweaking (केवल sysadmins द्वारा, चिंता मत करो), और अन्य क्षेत्रों के बीच, नए भूमिका नियमों के निर्माण की अनुमति देता है। जब कोई नया नियम बनाया जाता है तो मैं एक नया RoleRule
ऑब्जेक्ट बनाने की कोशिश करता हूं और इसे भूमिका के क्षेत्र rules
में डालता हूं। मैं डेटाबेस में परिवर्तन लागू करने के लिए session.update(role)
पर कॉल करता हूं।
अब बदसूरत हिस्सा आता है ... हाइबरनेट लेनदेन को बंद करते समय निम्नलिखित करने का निर्णय लेता है और flushing:
- डेटाबेस में नया नियम डालें। अति उत्कृष्ट।
- अन्य भूमिका फ़ील्ड अपडेट करें (संग्रह नहीं)। अब तक सब ठीक है।
- मौजूदा नियमों को अद्यतन करें, भले ही उनमें कुछ भी नहीं बदला है। मैं इसके साथ रह सकता हूँ।
- मौजूदा नियम फिर अद्यतन करें। स्वचालित टिप्पणी सहित लॉग से पेस्ट यहां दिया गया है:
/* delete one-to-many row Role.rules */ update ROLE_RULE set ROLE_ID=null where ROLE_ID=? and ROLE_RULE_ID=?
बेशक, सभी फ़ील्ड शून्य नहीं हैं, और यह ऑपरेशन शानदार रूप से विफल रहता है।
क्या कोई यह बताने की कोशिश कर सकता है कि हाइबरनेट ऐसा क्यों करेगा ??? और इससे भी महत्वपूर्ण बात यह है कि मैं इस तरह के फ्रेक कैसे प्राप्त करता हूं ???
edit: मुझे यकीन था कि यह मैपिंग के साथ कुछ करने के लिए था, और फिर मेरे मालिक, एक सनकी पर, दोनों वर्गों में equals()
और hashCode()
हटा दिया, ग्रहण का उपयोग करके उन्हें फिर से बनाया, और रहस्यमय रूप से इस समस्या को हल किया ।
मैं अभी भी अपने प्रश्न के बारे में बहुत उत्सुक हूं। क्या कोई सुझाव दे सकता है कि हाइबरनेट ऐसा क्यों करेगा?
आप किस ड्राइवर और बोली का उपयोग कर रहे हैं? –
एप्लिकेशन ओरेकल 10 जी पर चल रहा है, लेकिन इससे कोई फर्क नहीं पड़ता। – Yuval
सबसे महत्वपूर्ण बात यह है कि 'बराबर' और 'हैशकोड' विधियों के कार्यान्वयन आपकी पोस्ट से गायब हैं। डेटाबेस पहचान मानों के आधार पर आपके 'बराबर' और 'हैशकोड' विधियों का निर्माण ** हाइबरनेट या आपके डेटाबेस द्वारा उत्पन्न ** एक बुरा विचार है, जिससे उन्हें किसी भी क्षेत्र पर निर्भर किया जा सकता है जिसे निर्माण के समय के बाद अद्यतन किया जा सकता है। –