2011-07-06 22 views
7

पर मैं क्षेत्रोंअद्यतन CURRENT_TIMESTAMP और जेपीए

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 

@Version 
@Column(name = "edit_count") 
private short editCount; 

private String text; 

जब मैं Spring-Data-JPA साथ अद्यतन करने के लिए कोशिश के साथ एक इकाई है, मैं निरीक्षण EDIT_COUNT वृद्धि की गई है, लेकिन अभी भी edit_timestamp ही रहते हैं। यदि मैं मैन्युअल रूप से SQL

UPDATE post SET TEXT='456' WHERE post_id=1; 

संपादन_टिमस्टैम्प अपडेट किया गया है। यदि मैं

@PreUpdate 
protected void onUpdate() { 
    editTimestamp = new Date(); 
} 

यह w/o समस्या को काम करता है। मेरा सवाल यह है कि w/o @PreUpdate संपादन_टिमस्टैम्प अपडेट क्यों नहीं किया गया है?

+1

डाउनवॉटर करने के लिए, कृपया अपनी टिप्पणी प्रदान करें ... –

उत्तर

6

यह एक पुराना सवाल है, लेकिन सोचा कि अगर किसी और को यह उपयोगी लगे तो मैं जवाब में फेंक दूंगा। मुझे लगता है कि आपको अद्यतन करने योग्य = गलत शामिल करने के लिए कॉलम एनोटेशन को बदलने की आवश्यकता है। इससे edit_timestamp कॉलम को अद्यतन एसक्यूएल में प्रदर्शित नहीं किया जाएगा, इसलिए जेपीए प्रदाता में फ़ील्ड का वर्तमान मान शामिल नहीं होगा जो डिफ़ॉल्ट रूप से ओवरराइड करने के कारण होता है।

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     updatable = false 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 
+0

यह आंशिक रूप से काम करता है। Updatable = false के साथ, edit_timestamp कॉलम अद्यतन क्वेरी में दिखाई नहीं देता है। डेटाबेस से, मैंने देखा कि edit_timestamp को अद्यतन किया गया है। हालांकि, EditTimestamp के लिए गेटर अद्यतन मूल्य से अवगत नहीं है, क्योंकि यह @PreUpdate द्वारा ट्रिगर नहीं किया गया है, इसलिए यह अभी भी पुराना मान देता है। –

0

क्योंकि एनोटेशन के शुरुआती सेट में, आपने इसे एडिट_टिमस्टैम्प कॉलम के बारे में बताया है, यह एक टाइमस्टैम्प है; जेपीए नहीं जानता कि इसे अपडेट करने की जरूरत है। मैं अनुमान लगा रहा हूं कि जब आप मैन्युअल रूप से SQL कथन निष्पादित कर रहे हैं, तो आपके पास कुछ प्रकार के ऑन-अपडेट ट्रिगर हैं जो आपके लिए उन फ़ील्ड को बदल रहे हैं - लेकिन जब आप इसे अपडेट करते हैं तो स्थायी इकाई से आने वाले डेटा द्वारा ओवरराइट किया जा रहा है।
यदि आपको 'संपादित' गिनती/टाइमस्टैम्प की आवश्यकता नहीं है, तो उन्हें इकाई से निकालने का प्रयास करें, और देखें कि यह काम करता है या नहीं। अन्यथा, आपके पास एक कार्य समाधान है।

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