|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Вроде бы ничего сложного, но почему-то не выходит. Есть пара сущностей: Category Код: c# 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. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192.
Product Код: c# 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. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72.
И их маппинги: [spoiler Category][SRC c#] ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2012, 22:12 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
И их маппинги: Mappings Код: c# 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.
Выполняем код: Код: c# 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.
Структура категорий сохраняется и читается из базы нормально. Два созданных товара тоже добавляются в базу. А вот связи товаров с категориями не сохраняются. В чем дело? Думается мне что-то с маппингом неправильно, но что именно, ведь вроде все по букварям написано? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2012, 22:27 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Lexxxxx, сериализуйте маппинги, посмотрите, что получилось в виде xml. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 11:38 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, И убедитесь, что всё правильно в памяти. Если в памяти ошибки в связях - в базе будет тоже самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 11:39 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtorLexxxxx, сериализуйте маппинги, посмотрите, что получилось в виде xml. Не могли бы Вы "на пальцах" рассказать как это делается? В памяти перед сохранением вроде все нормально. Категория содержит два продукта, оба продукта имеют по одной и той же категории. Сохранение в базу проходит без исключений, но в таблице, которая связывает продукты и категории, нет ни одной записи. Соответственно при чтении из базы получаем категорию без продуктов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 11:57 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
На всякий случай выкладываю проектик с сущностями. http://dump.ru/file/5890203 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:03 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:09 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Спасибо. Вот что получается: Код: xml 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.
Код: xml 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.
На мой взгляд все вроде правильно, но не работает! Какого рожна ему надобно?! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:29 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Lexxxxx, Включите логгирование sql-запросов, и посмотрите, что он реально вставляет в бд. Если не поможет - попробуйте убрать inverse=true. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:38 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Вставляет он шесть категорий Код: sql 1.
и два товара Код: sql 1.
как и было задумано. А вот к таблице [CategoriesToProducts], которую он сгенерил чтобы связи хранить, обращений не производится. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:47 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Удаление инверсии ничего не дает. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 13:48 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Lexxxxx, У вас перепутаны названия столбцов в <key> и <many-to-many>. Смотрите пример . PS.1. Подумайте, надо ли вам bag? Мне кажется set здесь будет больше к теме. PS.2. Bag лучше использовать только на legacy-базах. Если приложении своё и новое - используйте idbag. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 14:02 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Вариант Код: xml 1. 2. 3. 4. 5. 6. 7. 8.
Код: xml 1. 2. 3. 4. 5. 6. 7. 8.
тоже не дал положительного результата. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 14:59 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Что интересно, пример с http://slynetblog.blogspot.com/2009/10/nhibernate.html тоже не работает. И свойства в <key> и <many-to-many> у меня вроде перепутаны не были (хотя переворот тоже результата не дал). Что же за фигня?! Вроде все как надо, а не фунциклирует! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 15:22 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Решение проблемы найдено. Оно оказалось совсем не очевидным, на мой взгляд. Сущности и маппинги оказались в порядке. Оказалось все происходит из-за того что сохранение сущности не обернуто в транзакцию. Решение нашел случайно в комментах к одной статье. Честно говоря это для меня дикость, что связь между сущностями (по сути один оператор SQL) не посылается в базу потому что все сохранение не обернуто транзакцией! Это наверное поэтому в букваре по NHibernate рекомендуют все оборачивать в транзакции, потому что сами толком не знают как оно работать будет и чего от него ожидать?! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 17:49 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Lexxxxx, NHibernate предпринимает очень много действий, чтобы добиться высокой производительности. Одно из них - как можно дольше откладывать обращение к БД, и записывать данные пачкой. В вашем случае для сущностей Продукт и Категория хибер был вынужден лезть в базу, чтобы получить значение identity. А вот для таблицы связи это было необязательно, т.к. Id он уже знал. Если бы вы использовали Hilo генератор ( что я и рекомендую ) nhibernate не стал бы генерировать запрос на вставку даже для Продукта и Категорий. Если очень хочется работать без транзакций вызывайте Flush, или ставьте у сессии SessionMode = AutoFlush. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 17:58 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Спасибо за науку! Мои познания в NHibernate крайне слабы и для меня будет очень полезной указанная Вами статья. Что-то я не нахожу у ISession свойства SessionMode. Может речь идет о session.FlushMode = NHibernate.FlushMode.Always? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 18:19 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
LexxxxxSolYUtor, Что-то я не нахожу у ISession свойства SessionMode. Может речь идет о session.FlushMode = NHibernate.FlushMode.Always? Угу, именно оно. Описался. А вообще говоря, NHibernate построен с unit of work в голове. Реализацией uow и является сессия. И правильно работать с ней примерно так: создали сессию, открыли транзакцию, сделали какой-то логический кусок работы, закрыли транзакцию, закрыли сессию. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 18:39 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, В Вашей статье написано "nhibernate высчитывает диапазон по формуле high * (max_lo + 1)..high * (max_lo + 1) + max_lo." Но не ясно (или я не внимательно читал) где и кем задается число high? Число max_lo, как я понял, пользователь задает сам при маппинге сущности. Хотелось бы детально понять как работает hilo генератор чтобы точно знать как правильно выбрать значение max_lo. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 18:56 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
Lexxxxx, Хибер поддерживает отдельную таблицу в бд (указывается в маппинге генератора), где держит текущее значение hi. Когда полностью выбирает диапазон (или при старте приложения) он в транзакции считывает это число, и потом увеличивает его на 1. И так снова до следующего раза или исчерпания диапазона. Таким образом, можно использовать даже несколько разных экземпляров хибера, т.к. они никогда не смогут получить одинаковое число hi. hilo-генератор можно настроить в двух вариантах: 1. Глобальные id на все сущности в базе (в последнее время склоняюсь к этому варианту, т.к. он требует меньше усилий). 2. Уникальные id в пределах иерархии классов. Для этого надо прописывать условие where в генераторе, и заполнять ту самую таблицу указанными значениями. Я обычно использую max_lo = 49. Тогда диапазон получается 50 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2012, 23:54 |
|
NHibernate не мапятся товары с категориями
|
|||
---|---|---|---|
#18+
SolYUtor, Не могу понять как заставить использовать глобальное пространство идентификаторов для всех сущностей. Как я понял, если я указываю в маппинге сущности Код: c# 1.
то для нее будет выделен диапазон в сто идентификаторов. Для остальных сущностей нужно тоже явно включать использование HiLo и указывать свой max_lo . А как заставить NH использовать HiLo для всех сущностей сразу и указать один max_lo для всех сущностей? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.10.2012, 10:52 |
|
|
start [/forum/topic.php?fid=17&fpage=30&tid=1350198]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
212ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 309ms |
0 / 0 |