2009-11-30 16 views
10

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

@Entity 
public class Product{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Long id; 

    String name; 
    Double price; 
    @ManyToOne(fetch = FetchType.LAZY) 
    Category category; 
... 
} 

@Entity 
public class Category implements Identifiable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String name; 
... 
} 

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

Product product = dao.get(productId); 
Category category = dao.get(categoryId); 
product.setCategory(category); 
dao.update(product); 

या

Product product = new Product(somename); 
Category category = dao.get(categoryId); 
product.setCategory(category); 
dao.insert(product); 

को अपडेट और बिना श्रेणी का चयन सम्मिलित करने के लिए संभव है? मैं इसके लिए एचक्यूएल या सीधा प्रश्नों का उपयोग नहीं करना चाहता हूं।

उत्तर

10

session.load() विशेष रूप से इस तरह के मामलों के लिए मौजूद है। निम्नलिखित:

Category category = session.load(categoryId); 
product.setCategory(category); 

डेटाबेस नहीं मारा जाएगा। हालांकि, यदि किसी दिए गए आईडी के साथ कोई श्रेणी उपलब्ध न हो तो यह बाद के चरण में (फ्लश के दौरान, कम या ज्यादा) अपवाद फेंक देगा।

load() का उपयोग merge() की तुलना में तेजी है और कोई साइड इफेक्ट है (व्यापक, आदि ...)

2

हाइबरनेट को आपके ऑब्जेक्ट की स्थिति निर्धारित करने के लिए एक सुरक्षित तरीका चाहिए। यही कारण है कि यह सुनिश्चित करने के लिए एक लंबा सफर तय कर रहा है कि आप विभिन्न सत्रों से ऑब्जेक्ट्स को मिश्रित नहीं कर सकते हैं (इसलिए आप स्टार्टअप पर श्रेणियां लोड नहीं कर सकते हैं और फिर बाद में उनका उपयोग कर सकते हैं)। यदि आप कॉन्फ़िगर

Product product = new Product(somename); 
product.setCategory(session.merge(category)); 

कि किसी भी डीबी दौर यात्राएं का कारण नहीं बनेगा:

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

0

मैं सिर्फ निम्नलिखित की कोशिश की है:

Category category = new Category(categoryId); 
product.setCategory(category); 

और यह काम किया, मैं उत्पाद रिकॉर्ड मतलब डीबी में आईडी

categoryId 

के साथ श्रेणी और श्रेणी के लिए सही लिंक मिला है।

+1

इस दृष्टिकोण के साथ समस्या यह है कि आप एक ही पहचानकर्ता के साथ लगातार इकाई का एक नया उदाहरण बना रहे हैं। यह इस समय आपके लिए काम कर सकता है क्योंकि प्रश्न में 'श्रेणी' ** वर्तमान ** सत्र से जुड़ा नहीं था; अगर यह था, तो हाइबरनेट एक अपवाद फेंक देगा। डेटा अखंडता के मामले में यह भी खतरनाक है; यदि आप 'श्रेणी' पर अपने कई से एक के लिए कैस्केडिंग निर्दिष्ट करना चाहते थे, तो उपर्युक्त कोड आपकी मूल श्रेणी को सभी रिक्त मानों (या बाधा उल्लंघन त्रुटि के साथ विफल) के साथ ओवरराइट करेगा – ChssPly76

+0

एचएम, मुझे एक एहसास था कि मैं कर रहा हूं यहाँ कुछ बुरा है। स्पष्टीकरण के लिए धन्यवाद। – Vladimir

संबंधित मुद्दे