2013-01-14 26 views
8

मैं कुछ फिल्में प्रबंधित करने के लिए एक हाइबरनेट/स्प्रिंग एप्लिकेशन पर काम कर रहा हूं।डेटाबेस में ऑब्जेक्ट सहेजें यदि यह पहले से मौजूद नहीं है (हाइबरनेट और स्प्रिंग)

कक्षा फिल्म में कक्षा शैली के साथ कई रिश्ते हैं। इन दोनों कक्षाओं ने जनरेटेड वैल्यू एनोटेशन का उपयोग करके आईडी उत्पन्न की है।

शैली @Cascade (CascadeType.SAVE_UPDATE) का उपयोग करके फिल्म ऑब्जेक्ट के माध्यम से सहेजी गई है, मैंने शैली के प्रकार विशेषता (जो इसका नाम है; उदाहरण के लिए "काल्पनिक" पर एक अनोखी बाधा डाल दी है।

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

अंततः मुझे जो चाहिए वह चुनिंदा-पहले-अपडेट की तरह कुछ है लेकिन चयन-से-सेव की तरह।

क्या हाइबरनेट में ऐसा कोई कार्य है?

कुछ कोड:

मूवी वर्ग

@Entity 
public class Movie { 

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

private String name; 

@Lob 
private String description; 

@Temporal(TemporalType.TIME) 
private Date releaseDate; 

@ManyToMany 
@Cascade(CascadeType.SAVE_UPDATE) 
private Set<Genre> genres = new HashSet<Genre>(); 

.... //other methods 

शैली वर्ग

@Entity 
public class Genre { 

@Column(unique=true) 
private String type; 

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

....//other methods 
+0

क्या आप मूवी से अलग शैली में जेनरेट इकाई से पूछ सकते हैं कि यह पता लगाने के लिए कि क्या पहले से ही "फंतासी" शैली है?साथ ही आप यह भी देख सकते हैं कि आपके जेनर मौजूद हैं या नहीं, यह देखने के लिए कि क्या आपके जेनर मौजूद हैं – Gleeb

+0

मैं इस बात की उम्मीद कर रहा था कि हाइबरनेट के लिए कुछ कार्यक्षमताएं थीं, लेकिन हाँ, यह भी एक अच्छा समाधान है। जैसा कि @ jordan002 ने कहा, मैं समस्या पर विचार कर रहा था। – Mike

+0

डालें-अगर-अस्तित्व एक बहुत ही आम ऑपरेशन है ... मुझे यह दुख हुआ कि हाइबरनेट इसे प्रदान नहीं करता है, और हमें चेक के साथ हमारे कोड को अव्यवस्थित करना होगा। –

उत्तर

5

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

आप जानते हैं कि आप शुरू से शैलियों की एक बहुत कुछ है नहीं होगा, तो आप 1 आर टी समय के सबसे में ऐसा करने के लिए विकल्पों में से एक जोड़ी है:

  1. हाइबरनेट दूसरे स्तर कैश यदि आप अस्तित्व की जांच करते हैं तो आपके सभी शैलियों में से कई को पकड़ सकते हैं, जिसके परिणामस्वरूप एक सरल हैशटेबल लुकअप (एक एकल नोड मानना) होता है।
  2. आप मान सकते हैं कि आपके सभी शैलियों पहले से मौजूद हैं, session.load() का उपयोग करें, और पंक्ति के परिणामस्वरूप नई डालने को संभालने के लिए अपवाद नहीं मिला है, जब आप उस शैली का संदर्भ देते हैं जो पहले से मौजूद नहीं है।

यथार्थवादी, हालांकि, जब तक कि आप बहुत सारे लेन-देन के बारे में बात नहीं कर रहे हैं, तो सहेजने/अपडेट करने से पहले एक सरल पूर्व-क्वेरी आपके प्रदर्शन को मारने वाली नहीं है।

3

मैं हाइबरनेट में इस तरह के एक समारोह के बारे में सुना नहीं किया है का चयन पहले अद्यतन/चयन-before- सहेजें इस तरह की स्थितियों में आपको हाइबरनेट का इलाज करना चाहिए जैसे कि यह जेडीबीसी था।

सबसे पहले अगर आप जानना चाहते हैं कि आपके पास ऐसी शैली है तो आपको इसके लिए पूछना चाहिए।

यदि आप करते हैं। तब जब आप इसे मूवी में जोड़ते हैं तो SAVE_UPDATE एक नया निर्माण नहीं करेगा। यदि आप नहीं करते हैं, तो हाइबरनेट डेटाबेस में एक नई शैली पंक्ति बनाएगा और आपके लिए कई_to_many तालिका में कनेक्शन जोड़ देगा।

+0

+1 धन्यवाद, लेकिन यह संभवतः कुछ और लुकअप के परिणामस्वरूप भी हो सकता है। मैं जो भी नई शैली जोड़ता हूं, उसके लिए मुझे डीबी की आवश्यकता होती है। – Mike

+1

चयन बहुत तेज प्रदर्शन है विशेष रूप से ऐसी छोटी तालिका (आप वास्तव में कितने शैली की उम्मीद कर रहे हैं) पर। साथ ही यदि आप अपने सर्वर पर उस तालिका का लाइव रिकॉर्ड रखते हैं। आपको केवल इसे एक बार कैश करने की आवश्यकता हो सकती है और सर्वर को तब तक बनाए रखने के लिए इसे बाद में बनाए रखना चाहिए – Gleeb