2011-03-14 17 views
7

मैं दो वर्गों है कहना फू और बार @OneToOne (द्विदिश) के रूप में मैप किया जेपीए साथ हाइबरनेट (3.6.1 अंतिम) (2.0) का उपयोग कर की तरह -अद्यतन कर रहा है हाइबरनेट संस्करण मैन्युअल

@Entity 
public class Foo{ 
    @Id 
    private Long id; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "foo") 
    private Bar bar; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "foo") 
    private Qux qux; 

    @Version 
    private int version; 

    // getters and setters omitted 
} 

@Entity 
public class Bar{ 
    @Id 
    private Long id; 

    @OneToOne 
     @JoinColumn(name = "foo_id", nullable = false) 
    private Foo foo; 

    // getters and setters omitted 
} 

@Entity 
public class Qux { 
    @Id 
    private Long id; 

    @OneToOne 
     @JoinColumn(name = "foo_id", nullable = false) 
    private Foo foo; 

    // getters and setters omitted 
} 

ध्यान दें कि - बार और क्यूक्स में @Version कॉलम

यदि हम बार अपडेट करते हैं तो हाइबरनेट फू के संस्करण को बढ़ाएगा और क्यूक्स के लिए समान नहीं होगा। लेकिन हमारे व्यापार तर्क की आवश्यकता है - अगर कोई फू में बार अपडेट करता है और अन्य थ्रेड उसी फू के क्यूक्स को अपडेट करने का प्रयास कर रहा है लेकिन बार बार अपडेट नहीं किया गया है और इसके विपरीत ऐसे अपडेट विफल हो जाएंगे।
चूंकि हम बार को अपडेट करते समय हाइबरनेट फू की संस्करण प्रॉपर्टी को अपडेट नहीं करता है, इसलिए हमने बार और क्यूक्स को अपडेट करने पर मैन्युअल रूप से Foo के संस्करण को अपडेट करने का निर्णय लिया है (मुझे पता है कि यह बहुत अजीब है और अनुशंसित नहीं है)।
यह पूरी तरह से ठीक काम करता है .. लेकिन मुझे समेकन में कुछ कोने के मामलों के बारे में चिंता है जो इस में असफल हो सकते हैं या अनपेक्षित व्यवहार करेंगे।
क्या इस उद्देश्य के लिए संस्करण के साथ इस प्रकार का बदलाव करना सुरक्षित है?

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT); 

यह में इस्तेमाल किया जा करने का इरादा है: या वहाँ यह करने के लिए किसी भी अन्य बेहतर विकल्प (मैं पहले से ही आशावादी की कोशिश की है/निराशावादी बल increament)

उत्तर

10

संस्करण अद्यतन मजबूर करने के लिए सही तरीका निम्न है मामलों।

EntityManager के अन्य तरीके LockModeType को भी उपयोग किया जा सकता है।

+0

लेकिन इसका उपयोग करने के लिए मुझे बार और क्यूक्स में एक संस्करण संपत्ति की आवश्यकता है, है ना? – Premraj

+0

@Premraj: हाँ .. – axtavt

+0

मैं इस कोड का उपयोग करने की कोशिश कर रहा हूं: 'Foo entity = new foo(); em.persist (foo); int oldVersion = entity.getVersion(); em.lock (इकाई, LockModeType.OPTIMISTIC_FORCE_INCREMENT); पुरानी वापसी == entity.getVersion(); ' मुझे उम्मीद है कि यह गलत होगा, लेकिन यह सच है। –

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