hibernate NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
I had this error when opening two sessions. One session for a User and another session for an object that has its primary key a foreign key from User. With this,the two session has the same primary key or identifier. I solved this by session.clear before session.update(type).
public T update(T type) {
Session session = getSession();
session.clear();
session.update( type );
session.flush();
return type;
}
public String getAccountsDetails(AccountDetails accountDetails) {
System.out.println("accountDetails.accoundId-->"+accountDetails.getAccountsId());
Session session = sessionFactory.openSession();
Query query = session.createQuery("from QBAccounts qba where qba.accountsId=:accId");
List<AccountDetails> queryList = query.setParameter("accId", accountDetails.getAccountsId()).list();
session.close();
Session session2 = sessionFactory.openSession();
// session.saveOrUpdate(accountDetails);
try{
if(queryList.size()>0){
session2.beginTransaction();
/*
* comment below line-50,51 to use update instead of merge, and uncomment line 53
*/
AccountDetails acDet = (AccountDetails) session2.get(AccountDetails.class, new Long(1));//line 50
session2.merge(accountDetails);//line 51
System.out.println("acDet-->"+acDet+" --accountDetails-> "+accountDetails);//line 52
// session2.update(accountDetails);//line 53
}else{
session2.beginTransaction();
session2.save(accountDetails);
}
}catch(DIRException e){
session2.getTransaction().rollback();
System.out.println("Getting Exception : " + e.getLocalizedMessage());
}finally{
session2.getTransaction().commit();
session2.close();
}
return "Successfully data updated into table";
}
Removed @GeneratedValue from my dto, since value was coming from UI.
Here is the good article, how to use MERGE/UPDATE
Try using one session only as suggested by lalit.
The code reduced to as below.
private String sessionType=null;
public String getAccountsDetails(List<Account> accountList) {
Session session = sessionFactory.openSession();
for (Account account : accountList) {
AccountDetails accountDetails = new AccountDetails();
accountDetails.setAccountsId(Long.parseLong(account.getId()));
accountDetails.setAccounttype(account.getAccountType().value());
Query query = session.createQuery("from QBAccounts qba where qba.accountsId=:accId");
List<AccountDetails> queryList = query.setParameter("accId", accountDetails.getAccountsId()).list();
if(queryList.size()>0){
session.update(accountDetails);
sessionType = "update";
}else{
session.save(accountDetails);
sessionType = "save";
}
}
session.flush();
session.beginTransaction().commit();
session.clear();
session.close();
return "Successfully data updated into table";
}