2013-01-17 15 views
5

मेरे पास एक सार वर्ग है जो कुछ सामान्य कार्यक्षमता प्रदान करता है जो कुछ ईजेबी इकाइयों को प्राप्त करने के लिए है। इनमें से एक टाइमस्टैम्प कॉलम है।सार कक्षा विरासत के साथ जेपीए इकाई

public abstract class AbstractEntity { 

    ... 
    private long lastModified; 
    ... 

    @Column 
    public long getLastModified() { 
     return lastModified; 
    } 

    public void setLastModified(long ts) { 
     lastModified = ts; 
    } 
} 

और

@Table 
@Entity 
public class MyEntity extends AbstractEntity { 
    ... 
    private Long key; 
    private String value; 
    ... 

    @Id 
    public Long getKey() { 
     return key; 
    } 

    public void setKey(Long k) { 
     key = k; 
    } 

    @Column 
    public String getValue() { 
     return value; 
    } 

    public void setValue(String txt) { 
     value = txt; 
     setLastModified(System.currentTimeMillis()); 
    } 
} 

मुद्दा यह है कि टाइमस्टैम्प स्तंभ डेटाबेस तालिका में जोड़ा नहीं जा रहा है। क्या अंतिम एनोडिफाइड फ़ील्ड को स्तंभ के रूप में विरासत में प्राप्त करने के लिए कुछ एनोटेशन है जिसे सार तत्व में जोड़ा जाना आवश्यक है?

मैंने AbentEntity में @Entity जोड़ने का प्रयास किया लेकिन इससे तैनाती पर अपवाद हुआ।

org.hibernate.AnnotationException: No identifier specified for entity: 
AbstractEntity 

उत्तर

13

आपके पास यहां कई संभावनाएं हैं।

आपने अपने सुपरक्लास के लिए मैपिंग परिभाषित नहीं किया है। यह एक queryable प्रकार माना जाता है, तो आप @Entity साथ उस पर टिप्पणी करना चाहिए और आप भी एक @Id विशेषता की आवश्यकता होगी आप तो

(इस लापता @Id विशेषता त्रुटि आप @Entity एनोटेशन जोड़ने के बाद हो रही है के लिए कारण है) अमूर्त सुपरक्लास को एक क्वेरी करने योग्य इकाई होने की आवश्यकता नहीं है, लेकिन इसके गुणों को इसके उप-वर्गों की तालिका में कॉलम के रूप में रखना चाहते हैं, आपको इसे @MappedSuperclass

पर टिप्पणी करना होगा यदि आप अपने सुपरक्लास को बिल्कुल एनोटेट नहीं करते हैं, तो यह है प्रदाता द्वारा क्षणिक माना जाता है और बिल्कुल मैप नहीं किया जाता है।

संपादित करें: वैसे, आप lastModified मूल्य अपने आप को बदलना चाहते हैं (सिवाय क्या तुम सच में करना चाहते हैं) नहीं है - आप हठ प्रदाता दे सकते हैं आप के लिए यह हर बार जब आप एक जीवन चक्र कॉलबैक साथ इकाई जारी रहती करना :

@PreUpdate 
void updateModificationTimestamp() { 
lastModified = System.currentTimeMillis(); 
} 
+2

बहुत धन्यवाद आपको कोस्टा - '@ मैप्डसुपरक्लास' एनोटेशन केवल वह समाधान था जिसे मैं ढूंढ रहा था। – Dobbo

+0

आपका स्वागत है :) आपके कोड में मैंने एक और चीज़ देखी है, शायद आपको यह उपयोगी लगेगा - संपादन देखें। – kostja

+0

फिर से धन्यवाद कोस्टा - आपका संपादन बिल्कुल ठीक है जहां मैं जा रहा था। जैसे ही ऐसा होता है मुझे खुद को 'अंतिम मॉडोडिफाइड' को संशोधित करना होगा (कुछ) इकाई वस्तुओं को क्लाइंट के साथ साझा किया जाता है और डेटा एक्सएमएल और जेएक्सबी के माध्यम से पहुंचाया जाता है। – Dobbo

0

आपको अपनी सार तत्व श्रेणी के ऊपर @MappedSuperclass एनोटेशन निर्दिष्ट करना होगा। इसका मतलब है कि आप निर्दिष्ट कर रहे हैं कि एबस्ट्रेटिटी क्लास में एनोटेटेड व्हीटेवर उस वर्ग का हिस्सा है जहां आप इस कक्षा को विस्तारित कर रहे हैं।

और आपने मैपिंग के जेडीबीसी टेबल - कॉलम नाम की भी देखभाल की है।

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