का उपयोग करके अद्यतन इकाई जब भी मैं अपनी उपयोगकर्ता इकाई को अद्यतन करने के लिए लगातार मॉडल का उपयोग करता हूं तो मुझे ERROR: duplicate key value violates unique constraint "users_pkey" Detail: Key (userid)=(2701) already exists.
मिल रहा है।EntityManager JPA EclipseLink
नीचे दिए गए कोड नमूने में: SetLoginAttempts एक उपयोगकर्ता इकाई में लेता है जिसे पूछताछ की गई है और जब मैं लेनदेन शुरू करता हूं तो मैं बस इकाई के फ़ील्ड में से एक सेट करता हूं और लगातार() कॉल करता हूं, फिर लेनदेन करता हूं।
/**
* @param user
* @param attemptNumber
*/
@Transactional
public void setLoginAttempts(Users user, int attemptNumber){
user.setLoginAttempts(attemptNumber);
System.out.println(user);
}
यहाँ है मैं कैसे संदर्भ और इकाई प्रबंधक हड़पने:
eFactory = Persistence.createEntityManagerFactory("persistenceUnit");
eManager = eFactory.createEntityManager();
जब स्टैक ट्रेस को देखकर, मैंने देखा कि वास्तव में प्रतिबद्ध एक डालने
Call: INSERT INTO USERS (userID, EMAIL, ISLOCKED, LOGINATTEMPTS, passwordHash, passwordSalt, USERNAME, version) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
bind => [2701, [email protected], false, 1, $shiro1$SHA-256$500000$6mqzZ/d/3BLQuJqLh1dDhQ==$NKW7Z++o/JTvf884aDWhP3Uhpyb5fTPMrm4joWnw7nI=, [[email protected], admin, 1]
क्या है injects स्प्रिंग रू में किसी इकाई प्रबंधक का संदर्भ देने का एक उचित तरीका, एक फ़ील्ड अपडेट करें और परिवर्तन करें?
संपादित
मैं विधि के लिए @Transactional जोड़ा गया है और स्टैक ट्रेस से पता चलता है कि इस इकाई प्रबंधक उदाहरण पैदा कर रही है:
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Creating new transaction with name [org.bixin.dugsi.service.UserService.setLoginAttempts]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Opened new EntityManager [[email protected]] for JPA transaction
[EL Finer]: 2012-03-14 23:49:15.503--ServerSession(2128384958)--Thread(Thread["http-bio-8080"-exec-18,5,main])--client acquired: 1116759395
[EL Finer]: 2012-03-14 23:49:15.503--ClientSession(1116759395)--Thread(Thread["http-bio-8080"-exec-18,5,main])--acquire unit of work: 368076985
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Not exposing JPA transaction [[email protected]] as JDBC transaction because JpaDialect [[email protected]] does not support JDBC Connection retrieval
Email: [email protected], Id: 2701, IsLocked: false, LoginAttempts: 2, Password: $shiro1$SHA-256$500000$6mqzZ/d/3BLQuJqLh1dDhQ==$NKW7Z++o/JTvf884aDWhP3Uhpyb5fTPMrm4joWnw7nI=, PasswordSalt: [[email protected], Roles: 0, Username: admin, Version: null
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Initiating transaction commit
2012-03-14 23:49:15,503 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [[email protected]]
[EL Finer]: 2012-03-14 23:49:15.503--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--begin unit of work commit
[EL Finer]: 2012-03-14 23:49:15.503--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--end unit of work commit
[EL Finer]: 2012-03-14 23:49:15.504--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--resume unit of work
2012-03-14 23:49:15,504 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [[email protected]] after transaction
2012-03-14 23:49:15,504 ["http-bio-8080"-exec-18] DEBUG org.springframework.orm.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
[EL Finer]: 2012-03-14 23:49:15.504--UnitOfWork(368076985)--Thread(Thread["http-bio-8080"-exec-18,5,main])--release unit of work
लेकिन ताज़ा करने के बाद भी अभी भी DB में कोई अपडेट नहीं लेनदेन बंद करने और डीबी को अपडेट करने का लेनदेन क्यों नहीं है?
मैं सिर्फ मर्ज के साथ() जारी रहती है की जगह की कोशिश की() और ऐसा लगता है कुछ भी नहीं के रूप में हुआ। स्टैक ट्रेस को फिर से देख रहे हैं और मुझे कुछ कारणों से यह "लेनदेन रोल वापस शुरू करना" मिलता है? मैं इसे वापस रोलिंग से कैसे रोकूं ताकि मैं डीबी – Warz
में परिवर्तनों को देख सकूं कक्षा के अंदर निम्नलिखित लिखें: '@PersistenceContext (unitName =" myEntityManager ") निजी इकाई प्रबंधक इकाई Mgr; सार्वजनिक शून्य सेट लॉजिनएटम्प्ट्स (उपयोगकर्ता उपयोगकर्ता, int tryNumber) { user.setLoginAttempts (tryNumber); entityMgr.merge (उपयोगकर्ता); } सार्वजनिक उपयोगकर्ता getUser (ऑब्जेक्ट उपयोगकर्ता आईडी) { वापसी इकाई Mgr.find (User.class, userId); } ' – Ameya