কীভাবে কোনও সত্তা ক্ষেত্রের মানচিত্র করবেন যার নাম জেপিএ-তে সংরক্ষিত শব্দ


92
@Column(name="open")

হাইবারনেট সহ স্কেলসার্ভার উপভাষা ব্যবহার করা।

[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'.

আমি টেবিল তৈরি করার সময় হাইবারনেটটি উদ্ধৃত শনাক্তকারী ব্যবহার করার আশা করতাম।

ক্ষেত্রটির নাম পরিবর্তনের পরিবর্তে কীভাবে এটি হ্যান্ডেল করা যায় সে সম্পর্কে কোনও ধারণা?


উদাহরণস্বরূপ দেখুন হাইবারনেট.ওঞ্জিরা
ব্রাউজ

উত্তর:


55

একই সমস্যা ছিল, তবে একটি টেবিলের নাম সহ Transaction। আপনি যদি সেট

hibernate.globally_quoted_identifiers=true

তারপরে সমস্ত ডাটাবেস শনাক্তকারীদের উদ্ধৃত করা হবে।

আমার উত্তরটি এখানে সারণী নাম হাইবারনেট ত্রুটি দেওয়ার ক্ষেত্রে বিশেষ অক্ষর পেয়েছে

এবং এখানে উপলভ্য সমস্ত সেটিংস https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html পাওয়া গেছে

যদিও এর জন্য আরও ভাল ডক্স সন্ধান করতে পারেনি।

আমার ক্ষেত্রে সেটিংসটি আমার স্প্রিং বৈশিষ্ট্য ফাইলে ছিল। মন্তব্যে উল্লিখিত হিসাবে, এটি অন্যান্য হাইবারনেট সম্পর্কিত, কনফিগারেশন ফাইলগুলিতেও হতে পারে।


9
এটি কীভাবে ডিফল্ট সেটিংস নয়?
জোশ এম

এসকিউএল অপঠনযোগ্য হতে পারে এবং কীওয়ার্ডকে নাম হিসাবে ব্যবহার করা খারাপ অভ্যাস যা উত্সাহ দেওয়া উচিত নয়। আমি মনে করি...?
রাফিক

4
ঠিক আছে. উপযুক্ত নয় এমন নামের উপরে আমি সারা দিন নাম হিসাবে পালানো সংরক্ষিত শব্দটিকে পছন্দ করব।
জোশ এম

হ্যাঁ, আপনি বলতে পারেন যে হাইবারনেট প্রদত্ত বিমূর্ততাটি কেবল উদ্বেগের বিষয় এবং প্রযুক্তিগতভাবে কীভাবে এটি প্রয়োগ করা হয় তা নয়। তবে আপনি যদি ফ্লাইওয়ে বা লিকুইবেসের মতো সরঞ্জামাদিও ব্যবহার করেন তবে তা সংরক্ষণের শব্দ থাকতে পারে তা বিবেচনা করার দরকার পড়লে এটি জটিলতায় যুক্ত হয়। স্কিমা স্থানান্তরিত করার সময় এটি আমার অভিজ্ঞতা।
রাফেক

4
যারা এটি নির্ধারণ করা দরকার ভাবছেন তাদের পক্ষে, এটি সম্ভবত persistence.xmlজেবস প্রকল্পগুলির মধ্যে আপনার মধ্যে রয়েছে ।
অ্যাডিসন

138

হাইপারনেটটি জেপিএ 1.0 সরবরাহকারী হিসাবে, আপনি ব্যাকটিক্সের মধ্যে এটি আবদ্ধ করে একটি সংরক্ষিত কীওয়ার্ডটি এড়াতে পারবেন:

@Column(name="`open`")

এটি হিবিরেট কোর থেকে উত্তরাধিকার সূত্রে প্রাপ্ত সিনট্যাক্স:

5.4। এসকিউএল উদ্ধৃত শনাক্তকারী

আপনি ম্যাপিং নথিতে ব্যাকটিকগুলিতে টেবিল বা কলামের নামটি বন্ধ করে হাইবারনেটকে উত্পন্ন এসকিউএলটিতে একটি সনাক্তকারীকে উদ্ধৃত করতে বাধ্য করতে পারেন। হাইবারনেট এসকিউএল ডায়ালেক্টের জন্য সঠিক উদ্ধৃতি শৈলী ব্যবহার করবে। এটি সাধারণত ডাবল কোট হয় তবে এসকিউএল সার্ভার বন্ধনী ব্যবহার করে এবং মাইএসকিউএল ব্যাকটিক্স ব্যবহার করে।

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

জেপিএ ২.০-তে, সিনট্যাক্সটি মানক করে এবং হয়:

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

তথ্যসূত্র

সম্পর্কিত প্রশ্নগুলি


এবং আমার কাছ থেকে ধন্যবাদ। এটি আমার একটি সমস্যার সমাধান করেছে। বিটিডব্লিউ
স্টিভ

4
আমি বুঝতে পারি না কেন আমাকে এটি করতে হবে, হাইবারনেট কেন আমার পরিবর্তে স্বয়ংক্রিয়ভাবে এটি করবে না ???
ড্যানিয়েল হুরি

@ ড্যানিয়েলহরি সম্ভবত আপনি আমার উত্তরটি আরও "স্বয়ংক্রিয়" পেয়েছেন?
রাফেক

4
@ রাফিক: ওহ হ্যাঁ, এটি সঠিক সমাধান, আপডভোট (ওয়াই)।
ড্যানিয়েল হুরি

4
ব্যবহার @Column(name="[open]")করা অনেক সুন্দর :)
ওয়ালিদ আবদালমাজিদ

16

সংরক্ষিত কীওয়ার্ডগুলি ম্যানুয়ালি পলায়ন

আপনি যদি জেপিএ ব্যবহার করে থাকেন তবে ডাবল উদ্ধৃতি দিয়ে পালাতে পারবেন:

@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

আরও বিশদের জন্য এই নিবন্ধটি দেখুন


15

আপনি যদি নীচে প্রদর্শিত হিসাবে ব্যবহার করেন এটি কাজ করা উচিত

@Column(name="[order]")
private int order;

আপনি কেবল বেসরকারী ক্ষেত্রে এটি করছেন?
জেক গ্যাস্টন

4
এটি স্কেলসার্ভার নির্দিষ্ট।
আলফ্রেডো এম

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

এটি নিশ্চিতভাবে কাজ করবে, যখন হাইবারনেট শিখছিলাম তখন আমার সাথে একই সমস্যা হয়েছিল।


4

না - কলামের নাম পরিবর্তন করুন।

এটি ডাটাবেস-নির্দিষ্ট, এবং আপনি কেবল এই জাতীয় কলাম তৈরি করতে পারবেন না। সর্বোপরি হাইবারনেট শেষ পর্যন্ত ডাটাবেজে ডিডিএল প্রেরণ করে। যদি আপনি এই কলামের নামটি দিয়ে কোনও বৈধ ডিডিএল তৈরি করতে না পারেন, এর অর্থ হাইবারনেট পাশাপাশি করতে পারে না। আমার মনে হয় না আপনি ডিডিএল লিখলেও উদ্ধৃতি প্রদান সমস্যার সমাধান করবে।

এমনকি যদি আপনি কোনওভাবে নামটি পালাতে সফল হন - এটি পরিবর্তন করুন। এটি এই ডাটাবেসের সাথে কাজ করবে তবে অন্যটির সাথে কাজ করবে না।


এটা কাজ করতে পারেস্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / ২৮৮775৫/২ দেখুন । আসুন ওপি'র নিশ্চয়তার জন্য অপেক্ষা করি।
ইওর্নলি

4
এটি ডাটাবেস-নির্দিষ্ট নয়! আপনি এটি একটি with দিয়ে এড়িয়ে যান এবং হাইবারনেট এসকিউএল ডায়ালেক্টের জন্য উদ্ধৃতি শৈলীটি সংশোধন করতে এটি অনুবাদ করেন
ড্যানিয়েল কেফার

2

কিছু জেপিএ বাস্তবায়ন (যেমন আমি ব্যবহার করি, ডেটা নিউক্লিয়াস) স্বয়ংক্রিয়ভাবে আপনার জন্য সনাক্তকারীকে উদ্ধৃত করে, যাতে আপনি কখনই এটি পান না।


হ্যাঁ, অবাক হয়ে যায় যে হাইবারনেট আপাতদৃষ্টিতে এখনও লোকেরা যতবার আঘাত পেয়েছে তার সংখ্যার ভিত্তিতে এমন মৌলিক বৈশিষ্ট্যটি সরবরাহ করে না (এবং এটি অন্য যে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.