|
|
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
При попытке обновления записи БД вываливается ошибка Код: sql 1. Код упрошён, обёрнут в транзакцию - она получается у меня длинная. Код: sql 1. 2. 3. 4. 5. Подскажите что нибудь по транзакциям и по сессии хибернеййта - как с этим бороться ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 01:56:43 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Прошу прощения - вот этот код, хотя разницы нет. Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 01:58:00 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513, А где division инициализируется? Думаю, дело в том, что сначала в division вытаскивается объект из БД, а потом вот в этой строке: Код: java 1. вы снова пытаетесь вытащить этот же объект. Из за этого возникает экспешн, который значит, что объект уже получен и связан с сессией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 09:36:59 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Вроде как не совсем так.. Т.е. происходит это в одной сессии и в одной транзакции. Как сделать это в одной транзакции - что бы не вываливался эксепшен ? Мой DAO Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. DivisionDao Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:38:34 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513, a different object with the same identifier value was already associated with the session DivisionImpl division = read(id); division.set(); divisionDao.getSession().update((DivisionImpl) division) Условно, вы должны получить состояние объекта из базы, работать с ним, а потом делать апдейт. У вас же получается : -вы создаете новый объект -получаете еще 1 объект (хотя и не явно) с тем же Id -пытаетесь новый объект сделать update Если я правильно понял всю проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:44:49 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513, вариант без наследования (2-х классов) не рассматриваем? Т.к. у тебя тут в коде ничего нету на 50 строк imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:47:50 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Озверин, да. У него 2 объекта и хибер почему-то не может сделать Merge. И непонятно, нужны ли автору их 2 штуки.... (он сказал что БЛ длинная) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:50:28 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123, я все еще не большой знаток, но учитывая текст ошибки, либо хибер и не должен никакого мерджа делать, либо не update надо вызывать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:53:21 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
"Условно, вы должны получить состояние объекта из базы, работать с ним, а потом делать апдейт." - т.е. если я правильно понял нужно сделать вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:53:38 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513, да, как то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:56:10 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Есть принципиальная разница между наследованием или нет ? И так и так я буду обращаться из транзакции к одной и той же сессии в DAO... если я правильно понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:56:19 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
ОзверинPetro123, я все еще не большой знаток, но учитывая текст ошибки, либо хибер и не должен никакого мерджа делать, либо не update надо вызывать ;) я просто встречал этот код Код: java 1. 2. 3. мне непонятно, почему при UPDATE записи в БД не нужно этого делать. А при ОРМ нужно. И неужели нельзя эту проверку убрать подальше (внутрь SaveOrUpdate). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:57:16 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513Есть принципиальная разница между наследованием или нет ? И так и так я буду обращаться из транзакции к одной и той же сессии в DAO... если я правильно понимаю. да. Это OFF\2 Просто, если в базовом классе нет логики, то он не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:58:21 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
И ещё [codde] IDivision division = divisionDao.read(divisionForm.getId()); if(division == null) { return false; } else { division.setTitle(divisionForm.getTitle().trim().replaceAll("<", "<")); divisionDao.getSession().update((DivisionImpl) division); return true; Т.е если я изменяю прочитаный обьект .set(...) и даже не ложу его в .update(...) - это работает . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 11:59:02 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123 , в базовом классе реализован CRUD, что бы в дочерних классах, для остальных DAO его не реализовывать по многу раз, а далле в дочерние добавляется логика. Если я в каждом DAO реализую эти методы отдельно друг от друга - приложение будет вести себя по другому ? В моём понимании изменится только количество сессий.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:02:58 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Проверку можно убрать дальше, но не хочется что бы бизнес логика была раскидана по всему приложению, если правильно понял вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:05:42 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513И ещё [codde] IDivision division = divisionDao.read(divisionForm.getId()); if(division == null) { return false; } else { division.setTitle(divisionForm.getTitle().trim().replaceAll("<", "<")); divisionDao.getSession().update((DivisionImpl) division); return true; Т.е если я изменяю прочитаный обьект .set(...) и даже не ложу его в .update(...) - это работает . Нет, вызывать таки я думаю надо;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:06:00 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Без вызова .update() работает )), ну можно конечно для красоты вызвать ). В общем ничего я не понимаю, что делать не знаю. Что почитать хоть посоветуйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:08:18 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513Проверку можно убрать дальше, но не хочется что бы бизнес логика была раскидана по всему приложению, если правильно понял вопрос. я спросил про длинные транзакции , но вы промолчали. В общем случае, такая ошибка возникает когда вы деаттачите объект или закрываете сессию раньше времени. Потом меняете объект, но он "другой" и его надо мержить или через Lock. Т.е. делайте короткие транзакции и следите чтобы объекты были не транзитными. Т.е. imho мешанина кода на первый взгляд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:09:28 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123ОзверинPetro123, я все еще не большой знаток, но учитывая текст ошибки, либо хибер и не должен никакого мерджа делать, либо не update надо вызывать ;) я просто встречал этот код Код: java 1. 2. 3. мне непонятно, почему при UPDATE записи в БД не нужно этого делать. А при ОРМ нужно. И неужели нельзя эту проверку убрать подальше (внутрь SaveOrUpdate). Тут подход все-таки немного другой. Вопрос, который задает себе хибер, учитывая целостность данных: -а как вы создали объект(насколько правильно?) , учитывая, что этот объект уже есть в базе данных?(если объект тривиальный, вам кажется и ответ простой, а если нет?) -а почему вы его создали, а не получили из базы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:09:47 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Озверин-а почему вы его создали, а не получили из базы? да. Я тебя понял. Либо объект деаттачили - оторвали от Хибера-БД и он не знает что с ним делать. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:20:26 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123alexander00513Проверку можно убрать дальше, но не хочется что бы бизнес логика была раскидана по всему приложению, если правильно понял вопрос. я спросил про длинные транзакции , но вы промолчали. В общем случае, такая ошибка возникает когда вы деаттачите объект или закрываете сессию раньше времени. Потом меняете объект, но он "другой" и его надо мержить или через Lock. Т.е. делайте короткие транзакции и следите чтобы объекты были не транзитными. Т.е. imho мешанина кода на первый взгляд. Мало что понял, т.к. новичок, если можно, разъясните пожалуйста. Я внутрь хибернэйта не залазил, работаю пока поверхностно, эксепшен явно связан с сессией, отсюда и пытаюсь разобраться. Когда этот код был написан в контроллере - он работал, всё проходило в разных транзакциях(чтение и обновление). Теперь же, мне в одной транзакции нужно проверить существует ли объект, потом принять данные пользователя, отвалидировать и обновить. Новый объект создаю из тех данных, которые получил от пользователя и пытаюсь положить его в метод .update(o) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:23:18 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Озверин, Получается, в общем случае: - не писать if == nil - не деаттачить объект или не работать с ним без сессии. - если объект новый, то ...... проверьте ЭТО ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:24:02 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
alexander00513Теперь же, мне в одной транзакции нужно проверить существует ли объект, потом принять данные пользователя, отвалидировать и обновить. Новый объект создаю из тех данных, которые получил от пользователя вот ЭТО проверь, что у тебя проходит в границах реквеста. Т.е. короткие сессии = РеквестHTTP = Сессии Хибера = Транзакции Хибера. Пока мысли такие.... imho ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:29:08 |
|
||
|
Сессия hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123Озверин, Получается, в общем случае: - не писать if == nil - не деаттачить объект или не работать с ним без сессии. - если объект новый, то ...... проверьте ЭТО Непонятно ведь, откуда у нового объекта PK такой же, как у другого объекта ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2012, 12:55:44 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37729284&tid=2132187]: |
0ms |
get settings: |
15ms |
get forum list: |
18ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
64ms |
get topic data: |
20ms |
get forum data: |
4ms |
get page messages: |
100ms |
get tp. blocked users: |
3ms |
| others: | 370ms |
| total: | 608ms |

| 0 / 0 |
