2012-06-21 17 views
17

बनाम ट्रिगर्स मैं वसंत 3.1.0.RELEASE, जेएसएफ 2.x, जेपीए 2 का उपयोग कर वेब अनुप्रयोग कर रहा हूं, हाइबरनेट प्रदाता, MySQL 5.1.x. एप्लिकेशन टॉमकैट 7. एक्स पर चलता है।जेपीए इवेंट

मेरी संस्थाओं में मैं कुछ अंतिम अद्यतन तिथि जैसे तिथि:

@Column(name = "last_update_date", insertable = false, updatable = false) 
@Temporal(TemporalType.TIMESTAMP) 
private Date lastUpdateDate; 

क्षण के लिए मैं एक ट्रिगर है कि अद्यतन:

CREATE TRIGGER upd_site BEFORE UPDATE ON site 
FOR EACH ROW SET NEW.last_update_date = CURRENT_TIMESTAMP(); 

यह ठीक काम करता है, लेकिन मैं सिर्फ इतना है कि नोटिस वहाँ जेपीए http://www.objectdb.com/java/jpa/persistence/event

जेपीए घटनाओं और माइस्क्ल के ट्रिगर्स के बीच सबसे अच्छा क्या है?

धन्यवाद।

उत्तर

13

मैं इसे DB में और जेपीए श्रोताओं के साथ ट्रिगर के साथ दोनों तरीकों का इस्तेमाल किया है, मैं जेपीए श्रोताओं पर आकर बस गए हैं क्योंकि:

  • केवल कोड जेपीए कोड में डेटाबेस से बात कर तो मैं डॉन ' समय के बाहर गिरने वाले समय के टिकटों के बारे में चिंता करने की ज़रूरत नहीं है। (यदि भविष्य में यह परिवर्तन बदलता है तो मैं ट्रिगर जोड़ सकता हूं और अपने मैप किए गए सुपर कैल्स को बदल सकता हूं)

  • जेपीए श्रोताओं इस अर्थ में कम जटिल हैं कि मुझे अपने डेटाबेस में बहुत सारे ट्रिगर्स बनाने की ज़रूरत नहीं है, इसलिए मेरे पास कम चीजें थीं बनाए रखने के लिए। चूंकि मैं सक्रिय रूप से विकासशील और डीबी संरचना को बदल रहा हूं क्योंकि मैं अपने महान के साथ जाने के लिए ट्रिगर्स को जाना और अपडेट करना नहीं चाहता क्योंकि मैं तेजी से विकास के माध्यम से पुन: प्रयास करता हूं।

  • मैं डेटाबेस पर पूरा नियंत्रण है और डाटाबेस है कि हर तालिका एक पूर्णांक pkey के लिए जा रहा था, और एक पूर्णांक संस्करण के लिए एक नियम बनाया है, और समय मुहर लगी टेबल insert_ts और update_ts कॉलम इन सार्वभौमिक होता है कि मेरे डीबी डिज़ाइन में नियम इसलिए जीवन आसान है मेरे पास इन दो मैप किए गए सुपरक्लेसेस हैं जो मेरे सभी एंटीसाइट्स को कोड से सरल बनाते हैं क्योंकि मैं उनसे विस्तार करता हूं।

@MappedSuperclass 
public abstract class PersistableObject { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="pkey") 
    private Integer pkey; 

    @Version 
    @Column(name="version") 
    private Integer version; 

    public Integer getPkey() { 
     return this.pkey; 
    } 

    public Integer getVersion() { 
     return this.version; 
    } 

    @Override 
    public String toString() { 
     return "Presistable Object: pkey=" + this.pkey + " Object: " + this.getClass().getName(); 
    } 
} 

और

@MappedSuperclass 
public class TimeStampedPersistableObject extends PersistableObject { 

    @Column(name = "insert_ts") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date insertTimestamp; 

    @Column(name = "update_ts") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date updateTimestamp; 

    @SuppressWarnings("unused") 
    @PrePersist 
    private void onInsert() { 
     this.insertTimestamp = new Date(); 
     this.updateTimestamp = this.insertTimestamp; 
    } 

    @SuppressWarnings("unused") 
    @PreUpdate 
    private void onUpdate() { 
     this.updateTimestamp = new Date(); 
    } 


    public Date getInsertTimestamp() { 
     return this.insertTimestamp; 
    } 


    public Date getUpdateTimestamp() { 
     return this.updateTimestamp; 
    } 
} 
+3

जेपीए घटनाओं के साथ एकमात्र समस्या यह है कि यदि आप एसक्यूएल के साथ डीबी अपडेट करना चाहते हैं? यह जेपीए घटनाओं को बाईपास करेगा।आम तौर पर डीबी स्वायत्त होना चाहिए और इसलिए डीबीए आपको ट्रिगर्स का उपयोग करने के बारे में बताएंगे। डेवलपर्स जेपीए कार्यक्रमों को पसंद करेंगे। –

18

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

एक और अंतर यह है कि जेपीए डेटाबेस द्वारा निष्पादित ट्रिगर से अनजान है। इसलिए यदि आप अपनी इकाई में कुछ फ़ील्ड अपडेट करते हैं, और जेपीए ने बदलाव को फ्लैश किया है, तो अपडेट तिथि ट्रिगर द्वारा संशोधित की जाएगी, लेकिन जेपीए इकाई अद्यतन तिथि का पुराना मान स्मृति में रखेगी। इसलिए यदि अद्यतन के बाद GUI में यह अद्यतन दिनांक प्रदर्शित होता है, तो अद्यतन दिनांक गलत होगी। नवीनतम अद्यतन दिनांक प्राप्त करने के लिए आपको इकाई को रीफ्रेश करना होगा।

+1

2 पैरा में टिप्पणी बहुत उपयोगी है। –

+0

डेटाबेस ट्रिगर और जेपीए कॉलबैक विधि के बीच मतभेदों का बिल्कुल सही सेट सेट। यदि आपके उपयोग के मामले की आवश्यकता है तो एक क्रॉन नौकरी भी एक अच्छा विकल्प है। – HopeKing