|
|
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Есть фабрика по созданию сессии: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Есть класс LigaDAO: Код: java 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. В двух разных браузерах пользователь открывает сущность Liga с id=2, первый пользователь удаляет запись, у второго она продолжает висеть на экране. Далее, второй пользователь сохраняет висящую на экране запись. В результате вызывается метод addOrUpdateLiga и в базе снова появляется объект Liga, который идентичен удаленному по всем полям кроме id. Как такие ситуации разрешаются? Это первый вопрос. Второй: как правильно реализовывать работу с сессиями Hibernate в веб-приложениях? необходимо открывать-закрывать сессию для каждого действия или как? Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 16:08 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Не надо делать addOrUpdate. Надо делать только Update. И тогда хибернейт заругается, что сущности уже нет (удалена) и не сохранит её снова. Ексепшн из хиберейта поймать и показать юзеру в браузере в виде вменяемого сообщения (окошко там всплывающее и т.д.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2014, 16:23 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
For AllНе надо делать addOrUpdate. Надо делать только Update. И тогда хибернейт заругается, что сущности уже нет (удалена) и не сохранит её снова. Ексепшн из хиберейта поймать и показать юзеру в браузере в виде вменяемого сообщения (окошко там всплывающее и т.д.) Сделала 2 метода: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. и второй: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Вызываю их следующим образом: Код: java 1. 2. 3. 4. 5. Сделала удаление в одном браузере, в другом пытаюсь изменить, выскакивает ошибка: Код: java 1. Не могу понять, это и есть тот самый эксепшн, который означает, что сущности уже нет (удалена)?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 00:48 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTВторой: как правильно реализовывать работу с сессиями Hibernate в веб-приложениях? необходимо открывать-закрывать сессию для каждого действия или как? есди без спринга то Код: java 1. 2. 3. 4. 5. 6. всю остальную лабуду спрятать в Код: java 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. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 10:34 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTСделала удаление в одном браузере, в другом пытаюсь изменить, выскакивает ошибка: Код: java 1. Не могу понять, это и есть тот самый эксепшн, который означает, что сущности уже нет (удалена)??Именно он: под катом хибернейт выполняет SQL-команду UРDATE (с условием типа WHERE ID=#value) через JDBC метод Statement.executeUpdate . Этот метод возвращает int - количество проапдейченых строк в базе. Хибернейт знает, что он апдейтит одну сущность (читай одну строку), а вот база по тому условию WHERE ни одной строки не находит и не апдейтит и, соответственно, метод executeUpdate возвращает 0. Хибернейт из-за этого несоответсвия ожидаемого и полученно бросает ексепшен, в тексте которого так и написано: returned unexpected row count from update [0]; actual row count: 0; expected: 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 12:15 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
IMHO, надо с начала расписаьб бизнес-логику и утвердить ее, а потом делать согласно ей. Что-нибудь на вроде. При сохранении ранее считанной и измененной записиь делаем: 1. Заблокировали запись если есть. 2. Если записи нет - то ... 3. Если заблокировать не удалось то ... 4. Проверяем не изменилась ли запись кем-то еще. 5. Если запись изменилась то ... 6. Если не изменилась то update. И с Hibernate будет разобраться намного легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 12:31 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевIMHO, надо с начала расписаьб бизнес-логику и утвердить ее, а потом делать согласно ей. Что-нибудь на вроде. При сохранении ранее считанной и измененной записиь делаем: 1. Заблокировали запись если есть. 2. Если записи нет - то ... 3. Если заблокировать не удалось то ... 4. Проверяем не изменилась ли запись кем-то еще. 5. Если запись изменилась то ... 6. Если не изменилась то update. И с Hibernate будет разобраться намного легче. Вся эта логика уже реализована хибернейтом и писать её самому заново совершенно нет необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 13:05 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Всем огромное спасибо за советы. Я вот еще чего не могу понять. Вот код одного из моих методов: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Нужно ли в нем закрывать сессию, или после коммита она закрывается самостоятельно? Когда добавляю к этому методу это: Код: java 1. 2. 3. 4. 5. В другом месте ругается на то, что я пытаюсь работать с закрытой сессией. вот метод по получению сессии: Код: java 1. 2. 3. И еще вопрос. Не могу понять когда в каком случае нужно очищать сессию и нужно ли делать это вообще? Про кеши 1,2 уровней и кеш запросов - читала. Задаю много вопросов т.к. хочется докопаться до сути, так что сорри :). Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 15:18 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
For AllВся эта логика уже реализована хибернейтом Я рад, что Hibernate думает за Вас, но написать на бумаге, что именно надо делать в случаях, которые отмечены ... , все равно не помешает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 15:41 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTВсем огромное спасибо за советы. Я вот еще чего не могу понять. Вот код одного из моих методов: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Простите, а вызов метода currentSession каждый раз, это сделано в ожидании, что вдруг в следующий раз это будет другая сессия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 15:46 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, нет, нужно было так сразу написать: Session sess=currentSession(); sess.beginTransaction(); sess.save(liga); sess.getTransaction().commit(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 16:03 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulT, 1. currentSession может и не быть. 2. Она может не открыться и пр. новомодно писать, что-то типа Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 16:20 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, В смысле Session sess = ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 16:20 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTНужно ли в нем закрывать сессию, или после коммита она закрывается самостоятельно?Думаю, что не стоит: управление currentSession() инкапсулировано в конкретной реализации CurrentSessionContext -е, а он может быть разный в зависимости от того standalone приложение это или внутри какого-нибудь application server-а (типа jboss) крутится. JulTИ еще вопрос. Не могу понять когда в каком случае нужно очищать сессию и нужно ли делать это вообще? Про кеши 1,2 уровней и кеш запросов - читала. Задаю много вопросов т.к. хочется докопаться до сути, так что сорри :). Спасибо!Кеш 1-го уровня (транзакционный) очищается каждый раз хибернейтом во время коммита/отката транзакции. Кеш 2-го уровня живёт дольше транзакций и педназначен для того чтобы не лезть каждый раз в базу (например 50 запросов в секунду к одной и той же таблице, а данные в таблице меняется раз в неделю - нет смысла на каждый запрос лезть в базу за данными, лучше закешировать в памяти и брать оттуда - быстрее). Минус кеша 2-го уровна в том, что если базу проапдейтит кто-то со стороны (в обход хибернейта) то кеш эти апдейты не увидит и будт продолжать отдавать закешированные старые записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 16:29 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за ответы. Я использую thread контекст: <property name="current_session_context_class">thread</property> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 18:01 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTВ другом месте ругается на то В каком именно другом месте. Я не очень верю в "универсальный код для разных мест". Т.е. нужен контекст применения Вами хибера......функция main....сервлет или ещё что.... JulTСпасибо всем за ответы. Я использую thread контекст: <property name="current_session_context_class">thread</property> это значит что вы не выходя из потока должны получить сессию хибера (а не БД), использовать и закрыть. Если это сервлет, то за доли секунды пока идёт вызов сервлета. Т.к. он может быть в потоке. 15894711 В десктопе всё по другому. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2014, 22:52 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123JulTВ другом месте ругается на то В каком именно другом месте. Я не очень верю в "универсальный код для разных мест". Т.е. нужен контекст применения Вами хибера......функция main....сервлет или ещё что.... JulTСпасибо всем за ответы. Я использую thread контекст: <property name="current_session_context_class">thread</property> это значит что вы не выходя из потока должны получить сессию хибера (а не БД), использовать и закрыть. Если это сервлет, то за доли секунды пока идёт вызов сервлета. Т.к. он может быть в потоке. 15894711 В десктопе всё по другому. Вот здесь http://j4sq.blogspot.com/2011/09/hibernate-reference-manual.html?m=1 вычитала следующее: По умолчанию метод commit() автоматически закрывает сессию, и при следующем обращении к getCurrentSession будет создана новая, так что делать close() или disconnect() не нужно. Как понять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 01:59 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulT, попробуйте так. Я предпочитаю минимум шума-кода на экране (10 строк) по ООП и здравому смыслу. Код: java 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. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 09:54 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Код: java 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 09:56 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
JulTВ двух разных браузерах пользователь открывает сущность В вебе всё проще пареной репы. Нет ООП и состояния объектов. Все стемятся чтобы ВЕСЬ код отработал за HTTP запрос клиента за 0,0001 сек. А-ля процедурный подход. Сделай минимальный тест чтобы 2 запроса были в разных потоках и всё освобождали. Открыл-закрыл-Открыл-закрыл-Открыл-закрыл-Открыл-закрыл- )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 10:06 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123, Перечитайте внимательно вопрос из первого сообщения. У топикстартера нет проблемы с тем, чтобы сессию открыть, закрыть, закоммитить, сохранить сущность и т.п. Проблема была в конкурентной модификации одних и тех же данных разными пользователями (в Web-приложении одновременно подсоединённых пользователей может быть очень много). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 11:17 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
For AllPetro123, Перечитайте внимательно вопрос из первого сообщения. У топикстартера нет проблемы с тем, чтобы сессию открыть, закрыть, закоммитить, сохранить сущность и т.п. Проблема была в конкурентной модификации одних и тех же данных разными пользователями (в Web-приложении одновременно подсоединённых пользователей может быть очень много). может я не вижу? автор Второй: как правильно реализовывать работу с сессиями Hibernate в веб-приложениях? необходимо открывать-закрывать сессию для каждого действия или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 11:56 |
|
||
|
Помогите разобраться с сессиями Hibernate
|
|||
|---|---|---|---|
|
#18+
Petro123может я не вижу? автор Второй: как правильно реализовывать работу с сессиями Hibernate в веб-приложениях? необходимо открывать-закрывать сессию для каждого действия или как?Ок, провтыкал, извиняюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 12:02 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38617703&tid=2127319]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
160ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 538ms |

| 0 / 0 |
