2009-12-02 10 views
5

मैं जानना चाहता था कि समुदाय वसंत जेडीबीसी के साथ कक्षा पदानुक्रमों के मानचित्रण के संबंध में "सर्वोत्तम प्रथाओं" को क्या मानता है।क्लास हाइर्चियों के साथ वसंत जेडीबीसी रोमैमैपर

हमारे पास एक पूर्ण ओआरएम उपकरण का उपयोग करने की क्षमता नहीं है, हालांकि हम जेडीबीसी की कुछ कठिन प्रकृति को कम करने के लिए स्प्रिंग जेडीबीसी का उपयोग कर रहे हैं। एक वर्ग जिसे हम बहुत नियमित रूप से लाभ उठाते हैं, बीनप्रॉपर्टी क्रोमैपर का उपयोग आसानी से किया जाता है और हमारे परिणाम सेट से असंवेदनशील बीन संपत्ति का उपयोग करने की क्षमता होती है।

मेरे पास एक वर्ग पदानुक्रम है कि सभी एक ही टेबल पर वापस आते हैं (इस छोटे श्रेणी के पदानुक्रम के लिए टेबल-प्रति-हाइर्चरी दृष्टिकोण लेते हैं)। इस प्रकार, तालिका में एक क्लास आईडी कॉलम होता है जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि वास्तव में किस कक्षा को तुरंत चालू किया जाना चाहिए। पूर्व। 1 = प्रबंधक, 2 = कर्मचारी, 3 = ठेकेदार। ये सभी "लोग" हैं लेकिन व्यक्ति के प्रत्येक उप-वर्ग में कुछ विशेषताएं हैं जो उनकी कक्षा के लिए अद्वितीय हैं।

मेरा प्रारंभिक विचार बीनप्रॉपर्टी क्रोमैपर का उप-वर्ग बनाना है और यह तर्क कहने का प्रयास करें कि "अगर कॉलम ए = 1 तो प्रबंधक को तत्काल करें और फिर अपना नामांकन बाध्यकारी करें"।

क्या यह उचित दृष्टिकोण की तरह लगता है? क्या आपके पास कोई अन्य सुझाव है जो आपके लिए काम कर चुके हैं?

अपने उत्तर के लिए अग्रिम धन्यवाद,

जस्टिन एन

उत्तर

4

वहाँ जहाँ आप पूरी तरह से के कार्यान्वयन को कॉपी किए बिना वर्ग स्विच करने के लिए एक हुक जोड़ सकते हैं उपवर्ग में एक जगह है जैसे यह नहीं दिखता है BeanPropertyRowMapper के लिए mapRow()। आपका सबसे अच्छा तरीका RowMapper क्लास बनाने के लिए हो सकता है जो उचित बीनप्रॉपर्टी RowMapper को प्रतिनिधि करता है।

उदाहरण के लिए:

final RowMapper managerMapper = new BeanPropertyRowMapper(Manager.class); 
    final RowMapper employeeMapper = new BeanPropertyRowMapper(Employee.class); 
    final RowMapper contractorMapper = new BeanPropertyRowMapper(Contractor.class); 

    RowMapper rm = new RowMapper() 
    { 
     @Override 
     public Object mapRow(ResultSet rs, int rowNum) 
      throws SQLException 
     { 
      int employeeType = rs.getInt("type"); 
      switch (employeeType) 
      { 
       case 1: 
        return managerMapper.mapRow(rs, rowNum); 

       case 2: 
        return employeeMapper.mapRow(rs, rowNum); 

       case 3: 
        return contractorMapper.mapRow(rs, rowNum); 

       default: 
        break; 

      } 
     } 
    }; 
+0

प्रतिक्रिया के लिए धन्यवाद। यही वह है जो मैंने कर लिया था! कुछ सत्यापन प्राप्त करने के लिए अच्छा है। – jnt30

1

मुझे यकीन है कि यह सबसे अच्छा अभ्यास 'है नहीं कर रहा हूँ, लेकिन मैं निम्नलिखित दृष्टिकोण का सुझाव (सेम गुण का उपयोग किए बिना -> तेजी से काम करना चाहिए)।

आमतौर पर आप जानते हैं कि आप किस प्रकार की वस्तु को पुनर्प्राप्त करने की उम्मीद करते हैं। तो एसक्यूएल निष्पादित करते समय आप संबंधित पंक्ति मैपर प्रदान कर सकते हैं।

कस्टम सार सामान्य RowMapper घोषित और व्यक्ति के प्रत्येक प्रकार के लिए अपनी पंक्ति नक्शाकार बनाते हैं, अर्थात्:

private static abstract class PersonRowMapper<T extends Person> implements RowMapper<T> { 

@Override 
public abstract T mapRow(ResultSet rs, int rowNum) throws SQLException; 

protected void mapBase(ResultSet rs, T person) throws SQLException { 
    //base mapping here 
} 
} 


private static class EmployeeRowMapper extends PersonRowMapper<Employee> { 

@Override 
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException { 
    Employee e = new Employee(); 
    mapBase(rs, e); 
    //set other specific employee props 
} 
} 

अन्य दृष्टिकोण से आप विशिष्ट रंगमंच की सामग्री के लिए आधार नक्शाकार में सार प्रणाली की घोषणा कर सकते हैं, यानी

private static abstract class PersonRowMapper<T extends Person> implements RowMapper<T> { 
@Override 
public T mapRow(ResultSet rs, int rowNum) throws SQLException { 
    T instance = getInstance(); 
    //set base props here 
    fill(rs, instance); 
} 

//e.g. return new Employee() 
protected abstract T getInstance(); 
//fill specific instance props 
protected abstract void fill(ResultSet rs, T instance) throws SQLException; 
} 
संबंधित मुद्दे