<union-subclass> (TABLE_PER_CLASS) দিয়ে পরিচয় কলাম কী প্রজন্ম ব্যবহার করতে পারবেন না


97

com.someoming.SuperClass:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
    private static final long serialVersionUID = -695503064509648117L;

    long confirmationCode;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
    public long getConfirmationCode() {
        return confirmationCode;
    }

    public void setConfirmationCode(long confirmationCode) {
        this.confirmationCode = confirmationCode;
    }
}

com.something.SubClass:

@Entity
public abstract class Subclass extends SuperClass {
    private static final long serialVersionUID = 8623159397061057722L;

    String name;

    @Column(nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

আমাকে এই ব্যতিক্রম দেয়:

Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass

আইডি তৈরির জন্য আমার পক্ষে সবচেয়ে ভাল এবং সবচেয়ে সুবিধাজনক উপায় কী? আমি আমার উত্তরাধিকার কৌশল পরিবর্তন করতে চাই না।

উত্তর:


232

এখানে সমস্যা হ'ল আপনি "টেবিল-প্রতি-শ্রেণি" উত্তরাধিকার এবং মিশ্রণ করুন GenerationType.Auto। এমএসএসকিউএলে একটি পরিচয় কলাম বিবেচনা করুন। এটি কলাম ভিত্তিক। "টেবিল-প্রতি-ক্লাস" কৌশলে আপনি প্রতি ক্লাসে একটি করে টেবিল ব্যবহার করেন এবং প্রত্যেকের আইডি থাকে।

চেষ্টা করুন:

@GeneratedValue(strategy = GenerationType.TABLE)


4
নিখুঁত সমাধান. এমনকি হাইবারনেট ফোরামগুলির কাছে এই সমাধানটি পাওয়া যায় নি বলে মনে হয়েছে এবং তারা ফোরামে এই বিষয়টি ঘুরে বেড়াচ্ছে hiberberate.org/…
স্প্রিং বানর

4
এই সমস্যাটি কি কেবল মাইএসকিএল এর সাথে বা তার নিয়মিত কারণ আমি প্রতি ক্লাস পদ্ধতির টেবিলের জন্য একটি ভিডিও দেখি এবং পোস্টগ্র্যাসে এটি ভাল কাজ করছিল
প্রশান্ত

4
একটি ড্রপউইজার্ড অ্যাপ্লিকেশন পরীক্ষা করার সময় আমি এটিতে ছুটে এসেছি। আমার ক্ষেত্রে আমি সেশন ফ্যাক্টরি তৈরি করতে ডিডাব্লু দ্বারা ব্যবহৃত একই কনফিগারেশন বিকল্পগুলি ব্যবহার নিশ্চিত করে তা সম্বোধন করেছি। আমি সম্পত্তিটি "হাইবারনেট.আইড.নেইউ_জেনেটর_ম্যাপিংস" সত্য হিসাবে সেট করার বিষয়টি নিশ্চিত pretty এটি ডিডাব্লু 0.7.0, হাইবারনেট 4.3.1, ডিবি এইচ 2 ছিল।
স্যুট করে

4
এটি পুরোপুরি কাজ করে। তবে, 'টেবল' আইডি প্রজন্মের কৌশলটি ব্যবহার না করা বাঞ্ছনীয় কারণ এটি প্রচুর ক্যোয়ারী (নির্বাচন করুন, সন্নিবেশ করান, এবং আপডেট করুন) এবং প্রাথমিক কীটির জন্য অনন্য মান উত্পন্ন করতে লকগুলি বজায় রাখে। তাহলে এর বিকল্প বিকল্প কী হবে যদি আমাদের একটি বড় ধরণের উত্তরাধিকারসূত্রে দেখা যায়? এটি অবশ্যই দুর্দান্ত পরিমাণে পারফরম্যান্সকে প্রভাবিত করবে।
ম্যাক 19

8

আমি আশ্চর্য হই যে এটি কোনও ডেটাবেস ডায়ালিক নির্দিষ্ট সমস্যা, যেহেতু পোস্টগ্রাইএসকিউএল সহ ইউটিউব টিউটোরিয়ালটি অন্তর্নিহিত ডাটাবেস হিসাবে দেখেছি যে ভিডিওটির স্রষ্টা সফলভাবে একটি অ্যাপ্লিকেশন ডিফল্ট @ জেনারেটেডভ্যালু দিয়ে চালাচ্ছেন। আমার ক্ষেত্রে (অন্তর্নিহিত ডাটাবেসটি মাইএসকিউএল) জেডবেকের প্রস্তাব অনুসারে আমাকে জেনারেটাইভ্যালু কৌশলটি জেনারেশনটাইপ.ট্যাবেলে পরিবর্তন করতে হয়েছিল।

ভিডিওটি এখানে: https://www.youtube.com/watch?v=qIdM4KQOtH8


পোস্টগ্র্যাস উত্তরাধিকার সম্পাদন করতে সক্ষম তাই আপনার সঠিক হতে পারে যে এটি ডেটাবেস নির্দিষ্ট: postgresql.org/docs/8.1/static/ddl-inherit.html কীভাবে স্কিমা উত্পন্ন হয় তা ভিডিও ব্যাখ্যা করে না (বা আমি এটি মিস করেছি)। সুতরাং সম্ভবত এনহাইবারনেট পোস্টগ্রাইস উপভাষা এটি নিজের দ্বারা করতে সক্ষম হয় বা পরিবর্তে আপনাকে ম্যানুয়ালি 'INHERITS' যুক্ত করতে হবে। আসলে আমি বলতে পারি না।
zoidbeck

6
PostgreSQL এ, হাইবারনেট ডিফল্ট ব্যবহার করতে হবে GenerationType.SEQUENCE। সে কারণেই এটি সেখানে স্বয়ংক্রিয়ভাবে কাজ করে। পোস্টগ্রিএসকিউএলএস এর সাথে একেবারেই কোনও সম্পর্ক নেইINHERITS
হেনিং

আমি একই টিউটোরিয়ালটি ব্যবহার করে যাচ্ছি এবং @ জেনারেটেড ব্যবহার করা সমস্যার কারণ হয়ে দাঁড়িয়েছিল যেহেতু আমি মাইএসকিউএল ব্যবহার করছি pএখন পোস্টটি না পাওয়া পর্যন্ত অনেক সময় ডিবাগিং করা উচিত
দ্বীন জন

5

জয়েডবেকের উত্তরের সাথে সম্মত হন। আপনার কৌশলগুলি এখানে পরিবর্তন করতে হবে:

@GeneratedValue(strategy = GenerationType.TABLE)

তবে এগুলি সব কিছু নয়, আপনাকে একটি নতুন সারণী তৈরি করতে হবে যা আপনার বিমূর্তের টেবিলটির প্রাথমিক কী অনুক্রমটি ধারণ করবে। এতে আপনার ম্যাপিংটি পরিবর্তন করুন

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "ConfirmationCodeGenerator")
@TableGenerator(table = "SEQUENCES", name = "ConfirmationCodeGenerator")
public long getConfirmationCode() {
   return confirmationCode;
}

এবং ডাটাবেসে একটি নতুন টেবিলটি নীচের মতো হওয়া উচিত: এখানে চিত্র বর্ণনা লিখুন

আপনি যখন নিজের অ্যাপ্লিকেশনটি চালিয়েছেন, হাইবারনেট একটি সারি সন্নিবেশ করবে যেখানে sequence_nameসত্তার নাম হবে ( SuperClassএই উদাহরণস্বরূপ) এবং sequence_next_hi_valueমানটি স্বয়ংক্রিয়ভাবে বর্ধিত হবে এবং সমস্ত প্রয়োগকারী সাবক্লাসের সারণীর নতুন রেকর্ডের জন্য ব্যবহৃত হবে।


2

আমাদের ক্ষেত্রে, আমরা দেব এবং উত্পাদনের জন্য একটি পোস্ট্রেএসকিউএল ডাটাবেস এবং পরীক্ষার জন্য একটি মেমরি এইচএসকিএলডিবি ডাটাবেস ব্যবহার করি। আমরা উভয় ক্ষেত্রে একটি আইডি উত্পন্ন করতে একটি ক্রম ব্যবহার করছি। দৃশ্যত GenerationType.AUTOডিফল্ট SEQUENCEpostgres জন্য, কিন্তু আমাদের স্থানীয় পরীক্ষায় ব্যর্থ হয়েছে (hsqldb জন্য অন্য কিছু ডিফল্ট হবে)।

সুতরাং যে সমাধানটি আমাদের পক্ষে কাজ করেছে, তা স্পষ্টভাবে ব্যবহার করুন GenerationType.SEQUENCE


1

আপনি উত্তরাধিকারের জন্য @ ম্যাপেডস্পারক্লাস ব্যবহার করতে পারেন


0

মাইএসকিউএল এবং পোস্টগ্রিএসকিউএল এর মধ্যে একটি এসকিউএল স্ট্যান্ডার্ড কমপ্লায়েন্স রয়েছে। পোস্টগ্র্যাস এসকিউএল পোস্টগ্রিস এসকিউএল 92/99 এর ভাল সাবসেটটি এই সাবসেটগুলির জন্য কিছু বস্তু-ভিত্তিক বৈশিষ্ট্যগুলি বোঝে। পোস্টগ্রিস জটিল রুটিন এবং নিয়মগুলি ডিক্যারেটিভ এসকিউএল কোয়েরি, সাবকিউরিস, ভিউ, মাল্টি-ইউজার সমর্থন, লেনদেন, ক্যোয়ারী অপ্টিমাইজেশন, উত্তরাধিকার এবং অ্যারে হিসাবে পরিচালনা করতে সক্ষম। বিভিন্ন ডাটাবেস জুড়ে ডেটা নির্বাচন সমর্থন করে না।

মাইএসকিউএল মাইএসকিউএল এসকিউএল 9 2 এর ভিত্তি হিসাবে ব্যবহার করে। অগণিত প্ল্যাটফর্মগুলিতে চলছে। মাইএসকিএল এমন কোয়েরি তৈরি করতে পারে যা বিভিন্ন ডাটাবেস থেকে সারণিতে যোগদান করতে পারে। বাম এবং ডান উভয় এএনএসআই এবং ওডিবিসি সিনট্যাক্স ব্যবহার করে বাইরের সাথে যোগ দেয় Supp এই রিলিজটি থেকে মাইএসকিউএল ৪.১ হিসাবে, মাইএসকিউএল সাবকিউরিগুলি পরিচালনা করবে। রিলিজ 5 হিসাবে দেখা সমর্থন

বিস্তারিত বিবরণের জন্য দয়া করে দেখুন। http://www-css.fnal.gov/dsg/extern/freeware/pgsql-vs-mysql.html


দয়া করে এটি সম্পর্কে খারাপ লাগবেন না তবে আমি মনে করি যে মাইএসকিউএল এবং পোস্টগ্রিসকিউএল তুলনা বিষয়টির সাথে অপ্রাসঙ্গিক (যদিও তাদের জন্য হাইবারনেট ডিফল্টগুলি আলাদা))
মি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.