2013-05-10 9 views
5

है मैं अनिवार्य रूप से निम्नलिखित श्रेणियां होती हैं:DTYPE डालने नहीं हाइबरनेट - मान शून्य

@Entity 
@Table(name="user") 
@Inheritance(strategy = InheritanceType.JOINED) 
public abstract class User implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "email_address") 
    private String emailAddress; 

    /* getters and setters not shown */ 
} 

और

@Entity 
@Table(name="admin") 
public class Admin extends User implements Serializable 
{ 
    private static final long serialVersionUID = 1L; 

    @Column(name = "role") 
    private String role; 

    /* getters and setters not shown */ 
} 

मैं डिफ़ॉल्ट एक स्तंभ DTYPE varchar(31) जो user तालिका में मौजूद है द्वारा उपयोग करने के लिए हाइबरनेट की उम्मीद है। मेरे कोड एक नया व्यवस्थापक वस्तु मैं कंसोल के लिए लॉग इन निम्न देखें जारी रहती है की कोशिश करता है:

Hibernate: insert into user (email_address) values (?) 
Hibernate: insert into admin (role) values (?) 

इस प्रकार का कोई प्रयास नहीं user.DTYPE स्तंभ स्थापित करने के लिए हाइबरनेट द्वारा किया जाता है, और यह डेटाबेस में शून्य रहता है। मुझे उम्मीद है कि यह Admin पर सेट हो जाएगा।

मैं क्या गलत कर रहा हूं? मैंने Admin कक्षा (और उपयोगकर्ता को भी जोड़ने की कोशिश की) पर @DiscriminatorColumn उपयोगकर्ता वर्ग और @DiscriminatorValue पर स्पष्ट रूप से सेट करने का प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है।

+0

पोस्टिंग के बाद 8 घंटे बाद मैं अपने प्रश्न का उत्तर नहीं दे सकता: कुछ और सोचने के बाद: मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि 'उपयोगकर्ता' सार है। चूंकि कोई 'उपयोगकर्ता' ऑब्जेक्ट सीधे चालू नहीं किया जा सकता है, इसलिए एक प्रकार के भेदभाव करने की कोई आवश्यकता नहीं है, क्योंकि समय समय से पहले ज्ञात होगा। अगर मैं गलत हूं तो किसी ने मुझे बताया! – Alex

उत्तर

4

InheritanceType.JOINED का उपयोग करते समय एक डिस्कमिनेटर कॉलम की वास्तव में आवश्यकता नहीं है, और this bug report पर आधारित, स्पष्ट रूप से हाइबरनेट एनोटेशन के साथ काम नहीं करता है।

आपकी टिप्पणी में, आप कहते हैं "क्योंकि कोई उपयोगकर्ता ऑब्जेक्ट सीधे चालू नहीं किया जा सकता है, इसलिए एक प्रकार का भेदभाव करने की आवश्यकता नहीं है, क्योंकि समय समय से पहले ज्ञात होगा।" और यह सही तरह का है। लेकिन मुख्य बिंदु वास्तव में यह है कि शामिल विरासत के लिए, डीबी से पुनर्प्राप्त कुछ प्रकार का पता लगाया गया है कि यह किस तालिका से आया था और उसे कॉलम में संग्रहीत नहीं किया जाना चाहिए।

भेदभावकर्ता कॉलम का समर्थन किया जाना चाहिए या नहीं, वास्तव में कुछ उलझन और बहस प्रतीत होती है कि वास्तव में मैंने देखा है कि को अस्वीकार कर दिया गया है, क्योंकि हाइबरनेट टीम ने फैसला किया है कि इसे समर्थित नहीं किया जाना चाहिए।

संबंधित मुद्दे