2009-10-14 16 views
6

काम नहीं कर रहा है मैंने अपने mySQL डेटाबेस में एक स्थिति को संभालने के लिए एक उपयोगकर्ता टाइप (नीचे देखें) बनाया है जहां हम 0000-00-00 00:00:00 के रूप में शून्य तिथियां सहेज रहे हैं।हाइबरनेट कस्टम उपयोगकर्ता टाइप

जब मैं अपनी इकाई को dispDT (नीचे देखें) के लिए शून्य के साथ कोशिश करता हूं और जारी करता हूं तो यह अपवाद उत्पन्न करता है: "javax.persistence.PersistenceException: org.hibernate.PropertyValueException: नॉन-नल प्रॉपर्टी संदर्भ शून्य या क्षणिक मान: myEntity .dispDt "

MySQLTimeStampUserType में प्रत्येक विधि में ब्रेकपॉइंट सेट करके मैं इसे गहरी कॉपी विधि कह सकता हूं और कभी भी nullSafeSet विधि को कॉल नहीं कर सकता। मैंने सोचा कि nuyllSafeSet विधि का पूरा बिंदु मुझे इसे जारी रखने से पहले मूल्य में हेरफेर करने की अनुमति देना था। मैं क्या गलत कर रहा हूं?

इकाई एनोटेशन

@Basic(optional = false) 
@Column(name = "disp_dt") 
@Type(type = "mypackage.MySQLTimeStampUserType") 
// @Temporal(TemporalType.TIMESTAMP) 
private Date dispDt; 

प्रयोक्ता प्रकार वर्ग

public class MySQLTimeStampUserType implements UserType { 

private static final int[] SQL_TYPES = {Types.TIMESTAMP}; 

public int[] sqlTypes() { 
    return SQL_TYPES; 
} 

public Class returnedClass() { 
    return Date.class; 
} 

public boolean equals(Object x, Object y) throws HibernateException { 
    if (x == y) { 
     return true; 
    } else if (x == null || y == null) { 
     return false; 
    } else { 
     return x.equals(y); 
    } 

} 

public int hashCode(Object arg0) throws HibernateException { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) throws HibernateException, SQLException { 
    // if the date is 0000-00-00 00:00:00 return null, else return the timestamp 
    Date result = null; 
    if (!resultSet.wasNull()) { 
     if (!resultSet.getString(names[0]).equals("0000-00-00 00:00:00")) { 
      result = resultSet.getDate(names[0]); 
     } 
    } 
    return result; 
} 

public void nullSafeSet(PreparedStatement statement, Object value, int index) throws HibernateException, SQLException { 
    // if the date is null set the value to "0000-00-00 00:00:00" else save the timestamp 
    if (value == null) { 
     statement.setString(index, "0000-00-00 00:00:00"); 
    } else { 
     statement.setTimestamp(index,(Timestamp) value); 
    } 

} 

public Object deepCopy(Object value) throws HibernateException { 
    return value; 
} 

public boolean isMutable() { 
    return false; 
} 

public Serializable disassemble(Object value) throws HibernateException { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public Object assemble(Serializable cached, Object owner) throws HibernateException { 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public Object replace(Object original, Object target, Object owner) throws HibernateException { 
    return original; 
} 
} 

उत्तर

4

आपकी समस्या आपका प्रयोक्ता प्रकार के साथ नहीं है - यह (@Basic वैकल्पिक का उपयोग कर तथ्य यह है कि आप नहीं-शून्य के रूप में अपनी संपत्ति की घोषणा की है के साथ है = "झूठा") और फिर भी आप इसे शून्य पर सेट कर रहे हैं।

उसने कहा, मैं गहरी कॉपी/इकट्ठा/अलग-अलग तरीकों में मूल मूल्य लौटने के बारे में सावधान रहूंगा। java.util.Date उत्परिवर्तनीय है और आप वहां परेशानी के लिए पूछ सकते हैं।

+0

डेटाबेस इस कॉलम के लिए शून्य मान की अनुमति नहीं देता है। इसके बजाय वे इसे "0000-00-00 00:00:00" के साथ पॉप्युलेट कर रहे हैं। मैंने सोचा कि UserType का बिंदु मुझे शून्य को "0000-00-00 00:00:00" में बदलने की अनुमति देना था। – Preston

+2

मैं डेटाबेस के बारे में बात नहीं कर रहा हूं। आप उस प्रॉपर्टी को अपने आवेदन में एनयूएलएल पर सेट कर रहे हैं; उस पर बाइक को हाइबरनेट करें क्योंकि इसे वैकल्पिक = गलत के रूप में मैप किया गया है। उस घोषणा को हटाएं और आपको जाने के लिए अच्छा लगेगा - डेटाबेस उस कॉलम में न्यूल नहीं मिलेगा क्योंकि आपका उपयोगकर्ता प्रकार इसे शून्य से बदल देगा। – ChssPly76

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