एक इकाई क्षेत्र को कैसे मैप करें जिसका नाम जेपीए में आरक्षित शब्द है


92
@Column(name="open")

हाइबरनेट के साथ sqlserver बोली का उपयोग करना।

[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.

मैंने मेज बनाते समय उद्धृत पहचानकर्ता का उपयोग करने के लिए हाइबरनेट की अपेक्षा की होगी।

कैसे क्षेत्र को नामांकित करने के अलावा ... इसे संभालने के बारे में कोई विचार?


उदाहरण के लिए देखें hibernate.onjira.com/browse/HHH-1272
Ondra žižka

जवाबों:


55

एक ही समस्या थी, लेकिन एक टेलेनैम के साथ बुलाया Transaction। यदि आप सेट करते हैं

hibernate.globally_quoted_identifiers=true

फिर सभी डेटाबेस पहचानकर्ताओं को उद्धृत किया जाएगा।

यहाँ मेरा जवाब मिला तालिका नाम हाइबरनेट त्रुटि देने में विशेष चरित्र

और यहां सभी उपलब्ध सेटिंग्स https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html मिलीं

हालांकि इसके लिए बेहतर डॉक्स नहीं मिल सके।

मेरे मामले में सेटिंग मेरी स्प्रिंग प्रॉपर्टीज़ फ़ाइल में थी। जैसा कि टिप्पणियों में बताया गया है, यह अन्य, हाइबरनेट संबंधित, कॉन्फ़िगरेशन फ़ाइलों में भी हो सकता है।


9
यह डिफ़ॉल्ट सेटिंग कैसे नहीं है?
जोश एम।

SQL अपठनीय हो सकता है और कीवर्ड का उपयोग कर रहा है क्योंकि नाम एक बुरा अभ्यास है जिसे प्रोत्साहित नहीं किया जाना चाहिए। मुझे लगता है...?
रफीक

1
ठीक है। मैं एक नाम के रूप में दिन भर एक नाम के रूप में एक बचा हुआ आरक्षित शब्द पसंद करूँगा जो फिट नहीं होता है।
जोश एम।

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

2
उन लोगों के लिए जहां यह सेट करने की आवश्यकता है, यह संभवतः persistence.xmlJBoss परियोजनाओं के लिए आपके लिए है।
एडिसन

138

JPA 1.0 प्रदाता के रूप में हाइबरनेट के साथ, आप एक आरक्षित कीवर्ड को बैकटिक्स में संलग्न करके बच सकते हैं:

@Column(name="`open`")

यह हाइबरेट कोर से विरासत में मिला वाक्य है:

5.4। SQL ने पहचानकर्ताओं को उद्धृत किया

आप मैपिंग डॉक्यूमेंट में बैकटिक्स में टेबल या कॉलम नाम को संलग्न करके जेनरेट किए गए SQL में एक पहचानकर्ता को उद्धृत करने के लिए हाइबरनेट को बाध्य कर सकते हैं। हाइबरनेट SQL बोली के लिए सही उद्धरण शैली का उपयोग करेगा। यह आमतौर पर डबल कोट्स है, लेकिन SQL सर्वर कोष्ठक का उपयोग करता है और MySQL backticks का उपयोग करता है।

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

JPA 2.0 में, सिंटैक्स मानकीकृत है और बन जाता है:

@Column(name="\"open\"")

संदर्भ

संबंधित सवाल


और मेरी तरफ से धन्यवाद। यह मेरे पास एक समस्या का हल था। btw - Ref अब पर है: docs.jboss.org/hibernate/stable/core/manual/en-US/html/…
स्टीव

5
मुझे समझ नहीं आ रहा है कि मुझे ऐसा क्यों करना है, हाइबरनेट मेरे बजाय यह क्यों नहीं करता है ???
डैनियल हैरी

@ डैनियल श्री शायद आपको मेरा जवाब अधिक "स्वचालित" लगता है?
रफीक

1
@ राफिक: ओह हाँ, यह सही समाधान है, upvoted (y)।
डैनियल हैरी

1
का उपयोग करना @Column(name="[open]")बहुत
प्रचलित है

16

आरक्षित खोजशब्दों को मैन्युअल रूप से बचाना

यदि आप JPA का उपयोग कर रहे हैं, तो आप दोहरे उद्धरण चिह्नों से बच सकते हैं:

@Column(name = "\"open\"")

यदि आप हाइबरनेट देशी एपीआई का उपयोग कर रहे हैं, तो आप बैकटिक्स का उपयोग करके उनसे बच सकते हैं:

@Column(name = "`open`")

स्वचालित रूप से आरक्षित खोजशब्दों से बच रहे हैं

यदि आप स्वचालित रूप से आरक्षित खोजशब्दों से बचना चाहते हैं, तो आप trueहाइबरनेट-विशिष्ट hibernate.globally_quoted_identifiersकॉन्फ़िगरेशन संपत्ति पर सेट कर सकते हैं:

<property
    name="hibernate.globally_quoted_identifiers"
    value="true"
/>

यमल प्रारूप

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true

अधिक जानकारी के लिए, इस लेख को देखें



11
@Column(name="\"open\"")

यह सुनिश्चित करने के लिए काम करेगा, एक ही समस्या मेरे साथ हुई, जब मैं हाइबरनेट सीख रहा था।


4

नहीं - कॉलम नाम बदलें।

यह डेटाबेस-विशिष्ट है, और आप केवल ऐसा कॉलम नहीं बना सकते। सभी हाइबरनेट के बाद अंत में डेटाबेस को DDL भेजता है। यदि आप इस कॉलम के नाम के साथ एक वैध डीडीएल नहीं बना सकते हैं, तो इसका मतलब हाइबरनेट भी नहीं हो सकता है। मुझे नहीं लगता कि यदि आप DDL लिख रहे हैं, तो उद्धृत करने से समस्या हल हो जाएगी।

यहां तक ​​कि अगर आप किसी तरह नाम से बचने में सफल होते हैं - तो इसे बदल दें। यह इस डेटाबेस के साथ काम करेगा, लेकिन दूसरे के साथ काम नहीं करेगा।


वह काम कर सकता हैStackoverflow.com/questions/285775/… देखें । आइए ओपी पुष्टि की प्रतीक्षा करें।
ewernli

1
यह डेटाबेस-विशिष्ट नहीं है! आप इसे एक `और हाइबरनेट अनुवाद के साथ SQL बोली के लिए उद्धरण शैली को सही करने के लिए अनुवाद करते हैं
डैनियल काफर

2

कुछ जेपीए कार्यान्वयन (जैसे मैं उपयोग करने वाला, डेटान्यूक्लियस) स्वचालित रूप से आपके लिए पहचानकर्ता का उद्धरण करता है, इसलिए आपको यह कभी नहीं मिलता है।


हां, आश्चर्य की बात है कि हाइबरनेट अभी भी ऐसी बुनियादी सुविधा की पेशकश नहीं करता है, जिसे देखते हुए लोग कई बार इसकी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.