1. 程式人生 > >hibernate的報錯資訊a different object with the same identifier value was already associated with the session解決辦法

hibernate的報錯資訊a different object with the same identifier value was already associated with the session解決辦法

廢話不多說,直接說原因,這是在hibernate中,有2個相同型別的實體類具有同樣的主鍵識別符號,然後呼叫update或者呼叫saveOrUpdate,我朋友出這個錯的由於他想要update一條資料時,獲取主鍵時從資料庫查詢獲取,此時接收的物件的主鍵id是12,吧這個值賦給要更新入參的物件,2個物件的主鍵就都是12了,所有會報錯,

 1 @Override
 2     public DTO createExamInfo(DTO dto) {
 3 
 4         Integer examId = GetParamUtil.convertObject(dto.getParam("examId"));
5 ExamInfo examInfo=new ExamInfo(); 6 ExamInfo examInfo = examInfoList.get(0); 7 8 examInfo.setExamId(examId); 9 Integer examPaperId = GetParamUtil.convertObject(dto.getParam("examPaperId")); 10 examInfo.setExamPaperId(examPaperId); 11 String title = GetParamUtil.converObject(dto.getParam("title"));
12 examInfo.setTitle(title); 13 Integer pattern = GetParamUtil.convertObject(dto.getParam("pattern")); 14 examInfo.setPattern(pattern); 15 Integer type = GetParamUtil.convertObject(dto.getParam("type")); 16 examInfo.setType(type); 17 Integer form = GetParamUtil.convertObject(dto.getParam("form"));
18 examInfo.setForm(form); 19 Integer monitor = GetParamUtil.convertObject(dto.getParam("monitor")); 20 examInfo.setMonitor(monitor); 21 String isPerpetual = GetParamUtil.converObject(dto.getParam("isPerpetual")); 22 examInfo.setIsPerpetual(isPerpetual); 23 String startTime = GetParamUtil.converObject(dto.getParam("startTime")); 24 examInfo.setStartTime(startTime); 25 String endTime = GetParamUtil.converObject(dto.getParam("endTime")); 26 examInfo.setEndTime(endTime); 27 String examCreateTime = GetParamUtil.converObject(dto.getParam("examCreateTime")); 28 examInfo.setExamCreateTime(examCreateTime); 29 String createDate = GetParamUtil.converObject(dto.getParam("createDate")); 30 examInfo.setCreateDate(createDate); 31 examInfo.setIsUsed(0); 32 examInfo.setDelFlg("0"); 33 List<ExamInfo> examInfoList=examInfoDao.findByProperty("examId", examId); 34 if (examInfoList!=null&&examInfoList.size()>0) { 35 examInfo.setId(examInfoList.get(0).getId()); 36 examInfoDao.update(examInfo); 37 }else{ 38 examInfoDao.save(examInfo); 39 } 40 41 return null; 42 }

第33行查出了這條資料,此時會話中包含一個id是12的物件(就是此時想要更新的那條資料的主鍵),然後35行又把id賦值給了另一個物件,執行update時就會報錯,我給他改進了一下程式碼,如下:

 1 @Override
 2     public DTO createExamInfo(DTO dto) {
 3 
 4         Integer examId = GetParamUtil.convertObject(dto.getParam("examId"));
 5         List<ExamInfo> examInfoList=examInfoDao.findByProperty("examId", examId);
 6 //        ExamInfo examInfo=new ExamInfo();
 7         ExamInfo examInfo = examInfoList.get(0);
 8         
 9         examInfo.setExamId(examId);
10         Integer examPaperId = GetParamUtil.convertObject(dto.getParam("examPaperId"));
11         examInfo.setExamPaperId(examPaperId);
12         String title = GetParamUtil.converObject(dto.getParam("title"));
13         examInfo.setTitle(title);
14         Integer pattern = GetParamUtil.convertObject(dto.getParam("pattern"));
15         examInfo.setPattern(pattern);
16         Integer type = GetParamUtil.convertObject(dto.getParam("type"));
17         examInfo.setType(type);
18         Integer form = GetParamUtil.convertObject(dto.getParam("form"));
19         examInfo.setForm(form);
20         Integer monitor = GetParamUtil.convertObject(dto.getParam("monitor"));
21         examInfo.setMonitor(monitor);
22         String isPerpetual = GetParamUtil.converObject(dto.getParam("isPerpetual"));
23         examInfo.setIsPerpetual(isPerpetual);
24         String startTime = GetParamUtil.converObject(dto.getParam("startTime"));
25         examInfo.setStartTime(startTime);
26         String endTime = GetParamUtil.converObject(dto.getParam("endTime"));
27         examInfo.setEndTime(endTime);
28         String examCreateTime = GetParamUtil.converObject(dto.getParam("examCreateTime"));
29         examInfo.setExamCreateTime(examCreateTime);
30         String createDate = GetParamUtil.converObject(dto.getParam("createDate"));
31         examInfo.setCreateDate(createDate);
32         examInfo.setIsUsed(0);
33         examInfo.setDelFlg("0");
34         if (examInfoList!=null&&examInfoList.size()>0) {
35 //            examInfo.setId(examInfoList.get(0).getId());
36             examInfoDao.update(examInfo);
37         }else{
38             examInfoDao.save(examInfo);
39         }
40         
41         return null;
42     }

直接採用查出資料時接收的物件作為更新時的入參,在這期間給物件set引數,這樣從始至終主鍵為12的物件就只有一個了