6

मैं निम्नलिखित है वंशानुगत पदानुक्रम:हाइबरनेट: क्या बहु-स्तर की विरासत को एकल तालिका में मैप करना संभव है?

Task 
    | 
SpecificTask 
    | 
VerySpecificTask 

और मैं यह usign एकल मेज विरासत जारी रहती है करना चाहते हैं, तो मैं वर्गों एनोटेट:

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class Task 

@Entity 
public class SpecificTask extends Task 

@Entity 
public class VerySpecificTask extends SpecificTask 

जब मैं VerySpecificTask की एक वस्तु को बचाने की कोशिश कक्षा, मुझे एक त्रुटि मिलती है:

Unable to resolve entity name from Class [com.application.task.VerySpecificTask] 
expected instance/subclass of [com.application.task.Task] 

मुझे क्या गलत लगता है? क्या बहु-स्तर की विरासत को एकल तालिका में मैप करना संभव है?

संपादित करें: यहां एक लंगड़ा बग था, मैंने जल्दी हल किया है, इसलिए मैंने इसे इस प्रश्न को गड़बड़ करने के लिए हटा दिया।

+2

आप एक discriminator स्तंभ कॉन्फ़िगर किया गया है की तरह लग रहा है? अपवाद का स्टैक ट्रेस क्या है? –

+0

मैं ऐपफ्यूज और डिसक्टीमिनेटर का उपयोग स्वचालित रूप से सेट किया गया है। – mrzasa

+0

जेएसआर 303 द्वारा मल्टी लेवल विरासत की अनुमति है। क्या आप निश्चित हैं कि एपफ्यूज विरासत वृक्ष में पहले स्तर से पहले एनोटेशन लागू कर रहा है? – Perception

उत्तर

4

ठीक है, मैं जोड़ दिया है discriminator स्तंभ और अब यह काम करता है। बदला गया कोड:

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
     name="DTYPE", 
     discriminatorType=DiscriminatorType.STRING 
    ) 

@Entity 
public class SpecificTask extends Task 

@Entity 
public class VerySpecificTask extends SpecificTask 

(मैं सिर्फ एक स्वीकृत उत्तर देने के लिए इसे जोड़ने रहा हूँ - मैं सवाल करने के लिए उपयोगी टिप्पणियों के बिना समस्या का समाधान नहीं होगा।)

0

@MappedSuperclass एनोटेशन का प्रयास करें:

@MappedSuperclass 
public class BaseEntity { 
    @Basic 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date getLastUpdate() { ... } 
    public String getLastUpdater() { ... } 
    ... 
} 

@Entity 
public class Order extends BaseEntity { 
    @Id public Integer getId() { ... } 
    ... 
} 

In database, this hierarchy will be represented as an Order table having the id, lastUpdate and lastUpdater columns. The embedded superclass property mappings are copied into their entity subclasses. Remember that the embeddable superclass is not the root of the hierarchy though.

1

स्वीकार किए जाते हैं जवाब लगभग पूर्ण है । इसे और स्पष्ट करने के लिए मैं प्रत्येक विरासत स्तर पर @DiscriminatorValue जोड़ना चाहता हूं।

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
     name="DTYPE", 
     discriminatorType=DiscriminatorType.STRING 
) 
public class Task 

--- 

@Entity 
@DiscriminatorValue(value="DS") 
public class SpecificTask extends Task 

--- 

@Entity 
@DiscriminatorValue(value="DV") 
public class VerySpecificTask extends SpecificTask 

और materiliazed तालिका

--------------- 
Table: task 
--------------- 
|...|DTYPE|...| 
--------------- 
|...|DS |...| 
|...|DV |...| 
|...|DS |...| 
...