मैं दो वर्गों है कहना फू और बार @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)
लेकिन इसका उपयोग करने के लिए मुझे बार और क्यूक्स में एक संस्करण संपत्ति की आवश्यकता है, है ना? – Premraj
@Premraj: हाँ .. – axtavt
मैं इस कोड का उपयोग करने की कोशिश कर रहा हूं: 'Foo entity = new foo(); em.persist (foo); int oldVersion = entity.getVersion(); em.lock (इकाई, LockModeType.OPTIMISTIC_FORCE_INCREMENT); पुरानी वापसी == entity.getVersion(); ' मुझे उम्मीद है कि यह गलत होगा, लेकिन यह सच है। –