2011-08-16 11 views
8

मेरे पास एक सतत ऑब्जेक्ट (एक्शन) और ऑटो जनरेटेड डेटा मॉडल (एक्शन_) है। एक्शन क्लास का ऑब्जेक्ट और सिंगुलर एट्रिब्यूट का एक उदाहरण होने के कारण, क्या दिए गए सिंगुलर एट्रिब्यूट के अनुरूप फ़ील्ड प्राप्त करना संभव है?एक निरंतर वस्तु के सिंगुलरएट्रिब्यूट मैप किए गए मूल्य को कैसे प्राप्त करें?

public S getValue(T object,SingularAttribute<T,S> attribute); 

मेरे इकाई वर्ग (Action.java):

@Entity 
@Table(name="ACTION") 
public class Action implements Serializable { 
    private long id; 
    private String name; 

    public Action() { 
    } 


    @Id 
    @Column(unique=true, nullable=false, precision=6) 
    public long getId() { 
     return this.id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 


    @Column(length=50) 
    public String getName() { 
     return this.name; 
    } 

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

मेरे मेटा मॉडल वर्ग (Action_.java):

@StaticMetamodel(Action.class) 
public class Action_ { 
    public static volatile SingularAttribute<Action, Long> id; 
    public static volatile SingularAttribute<Action, String> name; 
} 
+0

जेपीए वहाँ एक वस्तु के क्षेत्र के मूल्यों प्रदान करने के लिए नहीं है, यह जारी रहती है/वस्तु पुनः प्राप्त करने के लिए है। जैसा कि उत्तर कहता है, जावा प्रतिबिंब का उपयोग करें। – DataNucleus

उत्तर

4

मैं इस तरह एक समारोह की जरूरत है

सदस्य प्राप्त करने के लिए आप getJavaMember() विधि का उपयोग कर सकते हैं, फिर परीक्षण करें कि यह सदस्य Field याहै, और फ़ील्ड तक पहुंचें या प्रतिबिंब का उपयोग कर ऑब्जेक्ट पर विधि को कॉल करें।

आपको शायद इसे एक्सेस करने/आमंत्रित करने से पहले फ़ील्ड या विधि को सुलभ बनाना होगा। और आपको वस्तुओं को आदिम प्रकार के रूपांतरण को भी संभालना होगा।

मुख्य प्रश्न यह है कि आपको इसकी आवश्यकता क्यों है?

आप इसे केवल इस विशेष इकाई वर्ग के लिए की जरूरत है, तो आप बस विशेषता नाम पर एक स्विच का उपयोग करें और उचित मूल्य वापस कर सकते हैं:

switch (attribute.getName()) { 

    case "name": 
     return action.getName(); 
    ... 
} 
+0

आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद। मैं एक सामान्य वर्ग बनाना चाहता हूं जो किसी दिए गए निरंतर वस्तु (मेटा मॉडल का उपयोग करके) के साथ काम करने में सक्षम होना चाहिए। उदाहरण के लिए डेटाबेस की किसी भी तालिका का प्रतिनिधित्व करने के लिए एक वर्ग। GetJavaMember() फ़ंक्शन का उपयोग करना एकमात्र तरीका प्रतीत होता है लेकिन चूंकि सभी निरंतर वस्तुओं को अपने फ़ील्ड के लिए गेटर विधियां प्रदान करनी चाहिए, इसलिए मैं उम्मीद करता हूं कि एपीआई सभी फ़ील्ड प्राप्त करने की कार्यक्षमता प्रदान करे (आंतरिक रूप से आवश्यक होने पर गेटर विधि का उपयोग कर)। –

+0

यह काम करता है। जैसा कि मैंने @ कॉलम सेट किया गया है, इस आधार पर विधि या फ़ील्ड के सिंगुलर एट्रिब्यूट रिटर्न उदाहरणों की अपेक्षा की थी। एक बार फिर धन्यवाद! –

8

के रूप में जेबी Nizet सुझाव दिया है, तो आप getJavaMember उपयोग कर सकते हैं। मैंने पाया कि मुझे निजी फ़ील्ड को सुलभ होने की आवश्यकता नहीं थी, शायद हाइबरनेट ने पहले ही यह कर लिया है।

मामले में यह उपयोगी है, यहाँ कुछ कोड है जो मेरे लिए काम करता है:

/** 
* Fetches the value of the given SingularAttribute on the given 
* entity. 
* 
* @see http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object 
*/ 
@SuppressWarnings("unchecked") 
public static <EntityType,FieldType> FieldType getValue(EntityType entity, SingularAttribute<EntityType, FieldType> field) { 
    try { 
     Member member = field.getJavaMember(); 
     if (member instanceof Method) { 
      // this should be a getter method: 
      return (FieldType) ((Method)member).invoke(entity); 
     } else if (member instanceof Field) { 
      return (FieldType) ((Field)member).get(entity); 
     } else { 
      throw new IllegalArgumentException("Unexpected java member type. Expecting method or field, found: " + member); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 
+0

अच्छा समाधान। हमने आसानी से EntityAttributeCollection व्युत्पन्न किया है ताकि हम मौजूदा संग्रह में इकाइयों के गुणों को फिर से सक्रिय कर सकें। – mazatwork

+0

यह एक महान है! मैं जेएसएफ में अधिक कोड जोड़ने के बिना आसानी से एक नया कॉलम बना सकता हूं! – alexander

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