मेरे पास ओरेकल डेटाबेस में लीगेसी टेबल हैं जो मैं जावा एप्लिकेशन से हाइबरनेट के साथ एक्सेस करना चाहता हूं। समस्या यह है कि: टेबल में अच्छी प्राथमिक कुंजी नहीं है। उदाहरण के लिए, एक मेज इस प्रकार दिखाई देगा:अच्छे पीके के बिना ओरेकल विरासत तालिका: हाइबरनेट कैसे करें?
create table employee (
first_name varchar(64) not null,
last_name varchar(64) not null,
hired_at date,
department varchar(64)
);
create unique index emp_uidx on employee (firstname, lastname, hired_at);
मूल डिजाइनर यह सोच कर कि डेटाबेस कंपनी के बाहर जॉन स्मिथ के बीच अंतर करने की जरूरत कभी नहीं होगा, स्थिति फ़ील्ड के रूप में hired_at
स्तंभ का उपयोग करने का फैसला किया है, लेकिन वह उसी नाम वाले कर्मचारियों को उनकी hired_at तिथि से पहचाना जा सकता है। जाहिर है, यह एक प्राथमिक कुंजी बनाता है जो आंशिक रूप से शून्य और संशोधित है। चूंकि डेटाबेस इसे प्राथमिक कुंजी के रूप में अनुमति नहीं देगा, इसलिए वह इसके बजाय एक अद्वितीय अनुक्रमणिका के साथ चला गया।
अब, अगर मैं इस के लिए एक हाइबरनेट मानचित्रण लिखने की कोशिश, मैं कुछ इस तरह के साथ आ सकता है:
<hibernate-mapping>
<class name="com.snakeoil.personnel" table="employee">
<composite-id class="com.snakeoil.personnel.EmpId" name="id">
<key-property name="firstName" column="first_name" type="string"/>
<key-property name="lastName" column="last_name" type="string"/>
</composite-id>
<property name="hiredAt" column="hired_at" type="date"/>
<property name="department" type="string">
</class>
</hibernate-mapping>
यह डेटा पढ़ने के लिए काम करता है, लेकिन जब मैं नई प्रविष्टियों में केवल अलग बनाने के उनके किराए पर लिया गया तारीख, मैं org.hibernate.NonUniqueObjectExceptions में चलाता हूं। वैकल्पिक रूप से, मैं ओरेकल की ROWID सुविधा पर विचार कर सकता हूं:
<id column="ROWID" name="id" type="string">
<generator class="native"/>
</id>
यह डेटा पढ़ने के लिए भी ठीक काम करता है। लेकिन जाहिर है, आप नई ऑब्जेक्ट्स को जारी नहीं रख सकते हैं, क्योंकि हाइबरनेट अब एक org.hibernate.exception.SQLGrammarException फेंकता है: इकाई को स्टोर करने का प्रयास करते समय अगली अनुक्रम मान नहीं मिल सका।
इसका स्पष्ट तरीका सरोगेट कुंजी के माध्यम से है। हालांकि डेटाबेस स्कीमा को बदलने की आवश्यकता होगी, जो हमें उस "विरासत" चीज़ पर वापस लाएगा।
मैं क्या देख रहा हूं? क्या हाइबरनेट को ओरेकल के रोविड के साथ सहयोग करने का कोई तरीका है, शायद एक अलग जेनरेटर के साथ? या क्या पहला विचार काम करने का कोई तरीका है, शायद चालाक डीएओ के साथ जो संस्थाओं को बेदखल और पुनः लोड करता है, और आवेदन से जटिलता को छुपाता है? या क्या मुझे शायद हाइबरनेट, इबैटिस के विकल्प की तलाश करनी चाहिए?
हां, ऐसा लगता है कि यह सबसे अच्छा विचार है। अन्य सभी विकल्पों में क्रुफ़्टस्टिक डीएओ जादू की आवश्यकता होती है। – wallenborn
ओरेकल रोविड" स्थिर "है। केवल समस्या तब होती है जब (उद्धरण): _ अगर आप आयात और निर्यात के साथ एक पंक्ति को हटाते हैं और फिर से जोड़ते हैं उपयोगिताओं, उदाहरण के लिए, फिर इसकी पंक्ति बदल सकती है। यदि आप कोई पंक्ति हटाते हैं, तो ओरेकल अपनी पंक्ति को बाद में डाली गई एक नई पंक्ति में फिर से सौंप सकता है ._ – xmedeko
@xmedeko - उद्देश्यपूर्वक उस पैराग्राफ की पहली वाक्य को छोड़ दिया गया है "आपको इसका उपयोग नहीं करना चाहिए एक तालिका की प्राथमिक कुंजी के रूप में ROWID। "Http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm – APC