|
|
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть DAO слой на JPA и EJB, всё работает. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Решил делать запросы через объектные критерии. JPA Criteria API это вывих мозга показался мне, критерии Hibernate гораздо приятнее. Получаю сессию через Session session = getEntityManager().unwrap(Session.class); в методе getBooks(), и в итоге у меня список с дубликатами сущностей. Например, должно быть 10 разных записей, а получается вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Что я делаю не правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2012, 16:47:30 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
маппинг для Book где? sql log включили? Запрос посмотрели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 13:24:15 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#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. 30. 31. 32. 33. 34. 35. В SQL логе ничего особенного: Код: 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. Запросы через JPA работают прекрасно, дубликаты появляюстя только в родной сессии hibernate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 19:30:31 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
А ну так это бородатая багофича хибернейта https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 19:50:12 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
насколько я понял вот это может помочь criteria.setProjection(Projections.distinct(Projections.property("id"))); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 19:55:03 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
или вот это .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2012, 19:57:47 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Точно, это из-за outer join дубликаты появляются, т. к. идут запросы для дочерних элементов (авторов книги). setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) избавляется от дубликатов, но только в памяти, из базы они всё равно идут. Я так понял, что в случае если используется setFirstResult() и setMaxResults() нужно делать отдельные селекты для дочерних элементов. Это делается через criteria.setFetchMode("authors", FetchMode.SELECT). Тогда из базы нет дубликатов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 14:37:32 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Joe R, а почему у тебя 2 таблы вместо одной author2_, author3_ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 14:50:26 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Petro123Joe R, а почему у тебя 2 таблы вместо одной author2_, author3_ Ну, ManyToMany, же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 14:51:50 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Кстати, слышал, что ManyToMany это не оптимальный мэппинг. Вроде как эффективнее JoinTable выносить в отдельную сущность и работать с двумя OneToMany мэппингами. Какие есть мнения по этому поводу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:02:03 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczPetro123Joe R, а почему у тебя 2 таблы вместо одной author2_, author3_ Ну, ManyToMany, же. у него ManyToMany промежуточная из 2-х = Книги_Авторы Joe R, да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:20:56 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Petro123, если так, то хибер сгенерит ОДНУ таблу и там будут повторы. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:25:20 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Petro123у него ManyToMany промежуточная из 2-х = Книги_Авторы books - this_ authors_books - authors2_ authors - author3_ Где ты ещё увидел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:37:06 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, да, ты прав... псевдонимы... глаза сломаешь 8-) a,b,a_b ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:42:42 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
ну и, к слову, "авторы книги" это book authors, а не authors books. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:44:15 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Да, логичнее. А в чём заключается эффективность OneToMany по сравнению с ManyToMany? SQL запросов меньше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:55:14 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Joe R, - обычно а_b начинает обрастать полями и превращаться в сущность-класс - в реальной продакшен БД уже есть такая табла - у меня не вышло без дублей в БД выше кодом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 15:58:23 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
Joe RА в чём заключается эффективность OneToMany по сравнению с ManyToMany? SQL запросов меньше? Не знаю. Используем ManyToMany, где нужно. Проблем особых небыло. Где-то читал мнение, что в большинстве случаев в таблице ассоциации со временем будут вознкать дополнительные поля. Например, в вашем случае, порядоковый номер, для строгого упоминания авторов книги в определенном порядке. Тогда уже приходится заводить сущность для этой таблицы. Соответсвенно, почему бы не заложится на это сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 16:01:51 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
авторА в чём заключается эффективность OneToMany по сравнению с ManyToMany? SQL запросов меньше? Ну насчет эффективности можно рассуждать годами, а вот упрощение логики - это убийственное преимущество при любом раскладе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 16:13:49 |
|
||
|
Hibernate Session, EJB и дубликаты сущностей.
|
|||
|---|---|---|---|
|
#18+
авторНе знаю. Используем ManyToMany, где нужно. Проблем особых небыло. Где-то читал мнение, что в большинстве случаев в таблице ассоциации со временем будут вознкать дополнительные поля. Например, в вашем случае, порядоковый номер, для строгого упоминания авторов книги в определенном порядке. Тогда уже приходится заводить сущность для этой таблицы. Соответсвенно, почему бы не заложится на это сразу. еще часто возникают проблемы с каскадностью ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2012, 16:18:36 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=37692298&tid=2132391]: |
0ms |
get settings: |
11ms |
get forum list: |
24ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
44ms |
get topic data: |
18ms |
get forum data: |
4ms |
get page messages: |
91ms |
get tp. blocked users: |
2ms |
| others: | 334ms |
| total: | 540ms |

| 0 / 0 |
