2010-04-15 7 views
5

मैं जावा/स्प्रिंग एमवीसी और हाइबरनेट का उपयोग करके अपने वेब ऐप में एक साधारण ईएवी पैटर्न स्थापित करने की कोशिश कर रहा हूं। मुझे इस परिदृश्य के लिए हाइबरनेट एक्सएमएल सेटअप के पीछे जादू का पता लगाना प्रतीत नहीं होता है।उपयोगकर्ता के लिए हाइबरनेट के साथ ईएवी पैटर्न कार्यान्वित करना -> सेटिंग्स रिलेशनशिप

मेरे डेटाबेस तालिका "सेटअप" तीन स्तंभ हैं:

  • user_id (FK)
  • setup_item
  • setup_value

डेटाबेस समग्र कुंजी user_id से बना है | setup_item

यहाँ Setup.java वर्ग है:

public class Setup implements CommonFormElements, Serializable { 
    private Map data = new HashMap(); 
    private String saveAction; 
    private Integer speciesNamingList; 
    private User user; 

    Logger log = LoggerFactory.getLogger(Setup.class); 

    public String getSaveAction() { 
    return saveAction; 
    } 

    public void setSaveAction(String action) { 
    this.saveAction = action; 
    } 

    public User getUser() { 
    return user; 
    } 

    public void setUser(User user) { 
    this.user = user; 
    } 

    public Integer getSpeciesNamingList() { 
    return speciesNamingList; 
    } 

    public void setSpeciesNamingList(Integer speciesNamingList) { 
    this.speciesNamingList = speciesNamingList; 
    } 

    public Map getData() { 
    return data; 
    } 

    public void setData(Map data) { 
    this.data = data; 
    } 
}

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

<composite-id> 
    <key-many-to-one foreign-key="id" name="user" column="user_id" class="Business.User"> 
    <meta attribute="use-in-equals">true</meta> 
    </key-many-to-one> 
</composite-id> 

<map lazy="false" name="data" table="setup"> 
    <key column="user_id" property-ref="user"/> 
    <composite-map-key class="Command.Setup"> 
    <key-property name="data" column="setup_item" type="string"/> 
    </composite-map-key> 

    <element column="setup_value" not-null="true" type="string"/> 
</map> 

कैसे ठीक से इस आम परिदृश्य को मैप करने में कोई अंतर्दृष्टि सबसे की सराहना की होगी: यहाँ मेरे काम करने के लिए इस हो रही पर प्रारंभिक प्रयास है!

+0

@ ट्रेवर आपका स्वागत है, लेकिन यदि आप एक उपयोगी उत्तर देखते हैं, तो यूपीवोट, धन्यवाद! –

उत्तर

2

खुद के द्वारा दिखाया गया है, आपके पास एक असंगत मानचित्रण

तुमने कहा सेटअप वर्ग एक समग्र प्राथमिक कुंजी है (ध्यान दें मैं एक समग्र प्राथमिक कुंजी वर्ग बनाया है परिभाषित करता है (SetupId - bellow देखें) जो Serializable लागू करता है चाहिए और के बराबर होती है और hashCode विधि)

package ar.domain; 

import java.io.Serializable; 
import java.util.HashMap; 
import java.util.Map; 

public class Setup implements Serializable { 

    private SetupId setupId; 

    private User user; 
    private Map data= new HashMap(); 

    public SetupId getSetupId() { 
     return setupId; 
    } 

    public void setSetupId(SetupId setupId) { 
     this.setupId = setupId; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public Map getData() { 
     return data; 
    } 

    public void setData(Map data) { 
     this.data = data; 
    } 


    public static class SetupId implements Serializable { 

     private Integer userId; 
     private String setupItem; 

     public String getSetupItem() { 
      return setupItem; 
     } 

     public void setSetupItem(String setupItem) { 
      this.setupItem = setupItem; 
     } 

     public Integer getUserId() { 
      return userId; 
     } 

     public void setUserId(Integer userId) { 
      this.userId = userId; 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (o == null) 
       return false; 

      if (!(o instanceof SetupId)) 
       return false; 

      final SetupId other = (SetupId) o; 
      if (!(getUserId().equals(other.getUserId()))) 
       return false; 
      if (!(getSetupItem().equals(other.getSetupItem()))) 
       return false; 

      return true; 
     } 

     @Override 
     public int hashCode() { 
      int hash = 7; 
      hash = 11 * hash + (getUserId() != null ? getUserId().hashCode() : 0); 
      hash = 11 * hash + (getSetupItem() != null ? getSetupItem().hashCode() : 0); 
      return hash; 
     } 

    } 

} 

अपने सेटअप वर्ग की वजह से है मूल्य प्रकार का एक मानचित्र, आप परिभाषित करना चाहिए, इसकी मिश्रित विदेशी कुंजी जब अपने रिश्ते को परिभाषित (प्रमुख तत्व देखें)

<class name="ar.domain.Setup"> 
    <composite-id name="setupId" class="ar.domain.Setup$SetupId"> 
     <key-property name="setupItem" type="string" column="SETUP_ITEM"/> 
     <key-property name="userId" type="integer" column="USER_ID"/> 
    </composite-id> 
    <many-to-one name="user" class="ar.domain.User" column="USER_ID" insert="false" update="false"/> 
    <map name="data" table="DATA_TABLE"> 
     <key> 
      <column name="SETUP_ITEM"/> 
      <column name="USER_ID"/> 
     </key> 
     <map-key column="USER_ID"/> 
     <element column="SETUP_VALUE" not-null="true" type="string"/> 
    </map> 
</class> 

और साथ ही, एक समग्र विदेशी कुंजी कॉलम का उपयोग मानचित्र-कुंजी (यूएसER_आईडी, दाएं?) के रूप में करें जो समझ में नहीं आता है। क्यूं कर ?यहाँ मान लीजिए चला जाता है

  • हाइबरनेट , आप एक (मिश्रित) को अद्यतन प्राथमिक कुंजी स्तंभ

कि इसके अलावा की अनुमति नहीं है हाइबरनेट समग्र प्राथमिक कुंजी

के स्वत: उत्पन्न का समर्थन नहीं करता अपने सेटअप तालिका

SETUP_ITEM USER_ID 
0   1 
0   2 

और अपने DATA_TABLE

SETUP_ITEM USER_ID 
0   1 

क्या है कि क्या आप के बाद एक

Integer userId = 3; 
String setupValue = "someValue"; 

setup.getData().put(userId, setupValue); 
सेटअप तालिका की वजह से

एक USER_ID को जो मान 3 है परिभाषित नहीं करता है की कोशिश होता है, आप एक बाधा उल्लंघन देखेंगे।

मन

में रखें कि आप एक (मिश्रित) प्राथमिक कुंजी है, जो updatable नहीं किया जा सकता है, तो से बचने के लिए इसका इस्तेमाल करने के लिए, किसी न किसी प्रकार, एक परिवर्तनशील संपत्ति जो इसे पर निर्भर करता है बदलने के लिए। अन्यथा, हाइबरनेट इसे शिकायत करेगा।

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