पर्यावरण:हाइबरनेट 4 के साथ मैन्युअल रूप से @ वर्जन फ़ील्ड कैसे सेट करें?
मुझे लगता है कि User
इकाई है:
@Entity
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer userId;
@Version
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "VERSION", length = 19)
private Date version;
@Column(nullable = false, length = 20)
private String login;
// Getters and Setters
}
मैं जो उपयोगकर्ताओं को सूचीबद्ध एक खोज पृष्ठ है, तो मैं एक उपयोगकर्ता पर इसे संपादित करने के लिए क्लिक करें (दे रही है इसके userId
URL में)।
संपादित रूप में, मैं सर्वर पर स्टोर कर उस संस्था के क्षेत्र और जब मैं बचाने मेरे उपयोगकर्ता मैं यह कर:
User user = entityManager.find(User.class, userId)
user.setLogin(form.getLogin());
user.setVersion(form.getVersion());
user.setUserId(form.getUserId());
entityManager.merge(user);
प्रश्न:
तो अगर मैं सही ढंग से समझ में आ आशावादी हाइबरनेट के साथ लॉकिंग, यदि मैं एक ही उपयोगकर्ता को संपादित करने के लिए अपने ब्राउज़र में 2 टैब खोलता हूं, तो पहले टैब पर लॉगिन अपडेट करें, और फिर दूसरे टैब पर लॉगिन, मेरे पास OptimisticLockException
sho होना चाहिए क्या मैं नहीं हूँ
दरअसल, यह मेरे आवेदन पर मामला नहीं है ... मैंने सत्यापित किया है, form.getVersion()
दोनों मामले में समान मान लौटाता है, भले ही दूसरे अपडेट में, user.version
को पहले संपादन द्वारा अपडेट किया गया है।
क्या मुझे कुछ याद आ रही है?
EntityManager
@RequestScoped
बनाया गया है (इसलिए जब मैं विलय करने की कोशिश करता हूं तो मैं दो अलग-अलग EntityManager
एस पर हूं ...)।
मैंने entityManager.lock(user, LockModeType.OPTIMISTIC_FORCE_INCREMENT)
entityManager.merge(...)
(as said here) से पहले करने की कोशिश की है, लेकिन इससे मदद नहीं मिली।
मैं जेबॉस 7.0.2 के साथ सीम 3 का उपयोग कर रहा हूं। फाइनल (जो हाइबरनेट 4 का उपयोग करता है)।
क्या आप सुनिश्चित हैं कि इकाई प्रबंधक फ़्लश किया गया है (या लेनदेन प्रतिबद्ध है)? उत्पन्न SQL अद्यतन क्वेरी क्या है? –
हां, [हाइबरनेट एसक्यूएल डंपिंग के सक्रियण] के साथ [http://stackoverflow.com/questions/9159752/how-to-get-jdbc-binding-parameters-from-hibernate-in-jboss-7) मैं देख सकता हूं एसक्यूएल अपडेट और जेडीबीसी 'वर्जन' फ़ील्ड बाइंडिंग जो 'यूजर' में 'वर्जन' में सेट है जो 'आईडीई आईडी =' में सेट है? और संस्करण =? '... मैंने' फ्लशइंटरसेप्टर 'विकसित किया है जिसे मेरे' अपडेट' फ़ंक्शन मौजूद होने के बाद कहा जाता है और जो 'entityManager.flush() 'करता है। –