|
|
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Решил потестить wildfly, выбрал последний - 9.0.1, собрал тестовый примерчик из jboss-tools подборки (он правда под Jboss 7.1, но с помощью гуленья подправил его под 9 версию). В результате имеем мавеновский проект ear-приложения, с поддержкой wildfly9 и richfaces. А, ну да - собраннный в еклипсе с установленными jboss-tools. Суть тестового примера - одна форма с полями для ввода имени, почты, телефона, которые пишутся в БД по нажатию кнопки. Плюс бантики типа типа чтения выбранной записи через рест-сервис. Но интересовала миенно работа с разными БД. Попробовал по очереди настроить на все бд, которые есть под рукой. Oracle, postgresql - полёт нормальный. Пришла очередь firebird. И вот тут начались непонятки, решить которые самостоятельно не смог. Собственно об этом и вопрос. Сразу скажу, что с firebird работал мало и давно, поэтому конфиги надёргал из разных мест, может что наврал. Исходные: -- module.xml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. -- persistence.xml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. -- project-ds.xml Код: 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. 29. 30. 31. 32. 33. 34. 35. - По поводу -ds.xml - вроде как рекомендуется прописывать в standalone.xml, но работает и так и так, поэтому оставил -ds.xml, просто показалось для побаловаться удобнее. Начальные условия эксперимента: цепляемся к БД, в которой нет требуемой таблицы. Структура таблицы следующая (дёрнул скрипт из оракла, там она создалась автоматом): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Приложение должно её создать, и благополучно потом сохранять данные с формы. При перезапуске приложения, таблица находится, также благополучно пишем новые данные. Так и происходит в первых протестированных БД. Что не так в firebird. 1. При первом запуске обнаруживается отсутствие таблицы, и идёт попытка её создать, но в каком виде! Код: java 1. Это полный запрос! Вот откуда такие названия получились - могу только подозревать. И именно такая таблица и создаётся. Причём на сколько я помню формат для цегого в виде numeric(18,0) - не самый родной для firebird. При этом должен как выяснилось в последствии создаваться ещё и генератор HIBERNATE_SEQUENCE - тоже не создаётся. Далее по логам всё же обнаруживается непорядок (гугление не помогло понять ошибку): Код: 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. Но при этом приложение нормально грузится, т.е. появляется сообщение об успешном деплое. Цепляемся, пытаемся схранить данные - получаем сообщение об отсутствии таблицы. 2. Создаём таблицу, генератор руками, пергружаем приложение - вроде всё ок, всё работает. Но осадок остался. :) Ну собственно просьба помочь разобраться со странным поведением в случае firebird. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 14:19 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Просто забудьте про существование hbm2ddl. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 15:14 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Совет конечно дельный, но к особенностям firebird не имеет отношения. Самостоятельная накатка ddl без знания особенностей может тут привести к непредсказуемым последствиям. А особенность есть: максимальная длина индекса в ФБ составляет 1/4 размера страницы, и это в байтах (а буквы в utf-8 могут быть до 6 байт). Плюс для индексируемых строк надо отнять еще 9 байт. Поэтому очень важно знать page size для базы данных, так как из скрипта видно создание индекса на USER_EMAIL длиной 255. Диалект, надеюсь, третий? И хорошо бы увидеть меппинг, а не результирующий ddl 2) связь module<->driver (в standalone.xml) установлена? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 17:43 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
ivanraа буквы в utf-8 могут быть до 6 байтЮникод ограничен двадцать одним битом на кодовую точку (BMP и шестнадцать CMP), поэтому предельный размер всех UTF-вариантов - четыре байта на кодовую точку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2015, 17:46 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
ivanra, И связь установлена, и диалект третий. И собственно я даже не против создавать структуру базы сам. Но убивает вот какой фокус: 1. Создаю генератор руками. Описанная ошибка (org.hibernate.dialect.FirebirdDialect does not support pooled sequences) исчезает. По буквам из ошибки собственно и видно, что ругается на sequences. 2. При этом таблицы создаются без ошибок, но почему две? По прейскуранту "ентити простое тестовое" - одна штука. Думал, может что пропустил. Но во первых полный шмон по проекту ничего не дал, во вторых в ранее тестируемых БД создавалась именно одна таблица. В firebird создаётся та что описана, плюс ещё какая то странность на два поля. Что за выкидыш - пытаюсь разобраться. Убивание этого придатка ведёт к его восстановлению при следующем запуске. 3. Но далее всё работает. В общем заинтригован до крайности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 07:58 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
AndreyDmtВ общем заинтригован до крайности. В hibernate вообще поддержка firebird сделана как-то через зад :) Я правда, 7 лет назад с этим имел дело, но впечатлился. 1. Версию диалекта, что ли (забыл за давностью), оно прочитать не умело, надо было руками задавать. Я написал фикс в 2 строки, jar'ку у себя расположил, и отправил diff в качестве предложения. Да, тогда так надо было- svn, все дела. Через 5 лет мне пришёл ответ- мол ты чё, мужик, у нас же git, надо pull-request делать. Я уж и забыл к тому времени, что такое firebird... 2. Вообще он какой-то неприкаянный- там и jdbc драйвер-то писан одним человеком, не говоря уже про связку с hibernate. Поэтому совет "не давай ему делать DDL"- лучший. Мало ли там какие баги ещё бегают... PS: а какая таблица создаётся? Имя, поля? Как-нибудь с основной связано? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 09:51 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovivanraа буквы в utf-8 могут быть до 6 байтЮникод ограничен двадцать одним битом на кодовую точку (BMP и шестнадцать CMP), поэтому предельный размер всех UTF-вариантов - четыре байта на кодовую точку. Речь идет об особенностях firebird, там 6 байт на символ pagesize 4096: допускает создание индекса по UTF8-полю только до varchar(169). Why ? , да и в википедии тоже. AndreyDmt, сложно обсуждать MappingException, не видя самого меппинга. Из лога только видно, что не хватает таблицы Registrant и таблицы hibernate-генераторов hibernate_sequence, не надо её путать с firebird-генератором Я лично делал проект, работавший на firebird и mysql, особых проблем не было. Если хочется разобраться, то надо показать меппинг. Также неплохо бы увидеть генерируемый ddl, для этого надо в standalone.xml настроить соответствующую категорию логгера (subsystem xmlns="urn:jboss:domain:logging:1.1"): Код: xml 1. 2. 3. ну и чтобы не ломать глаза в persistence.xml Код: xml 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 10:18 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Левая табличка такая Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 12:14 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
AndreyDmtЛевая табличка такая Код: plsql 1. 2. 3. 4. А это поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 13:20 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Ну что это временная таблица от хибернейта я по буквам догадался. Не догадался я почему в двух первых БД этой таблицы нет, а вот в firebird есть. Исключительная таблица для конкретной БД? А когда и дальше сломалось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 13:40 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
AndreyDmt, пока что найти ошибку в генерации может только телепат. Это что угодно - не тот размер страницы БД, ключевое слово, неподдерживаемый тип данных, и т.д. 1) нужен меппинг 2) желательно иметь генерируемый скрипт. Для этого даже можно завести отдельный файл в логах (hbm2ddl.log): Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. (выше я ошибся с категорией, конечно же "org.hibernate.tool.hbm2ddl" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 14:17 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
ivanra, До маппинга похоже дело и не доходит, до создания непостредственно таблиц не дошло, ломается при попытке создать талицу (ли?) hibernate_sequence, в логе практически ничего нового. Вот кусок с непосредственно с созданием объектов: Код: 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. И как я уже ранее написал, что если создать руками генератор (а всё таки не таблицу), то нормально и другие объекты создаются. Т.е. хибернейт хочет всё таки найти генератор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 14:24 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
ivanra, Пр категорию я догадался, поправил, но вот дебажных сообщений от hbm2ddl не появилось. Включал дебаг глобально. Попробовал по приведённому конфигу: файл получил на 10 строчек - та же инфа, тоже без подробностей. Как говорится - сам удивлён. Ещё одна заморочка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 14:38 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
AndreyDmt, Применяя телепатию, пришел к выводу, что в меппинге видимо стоит Код: java 1. Поскольку действительно FirebirdDialect не поддерживает pooled sequences, возможны 2 выхода: 1) перед генерацией схемы вручную создать генератор HIBERNATE_SEQUENCE 2) поменять на GenerationType.AUTO или какой-нибудь другой тип как вариант - создать собственный диалект, наследник от org.hibernate.dialect.FirebirdDialect, там переопределить метод getCreateSequenceString(String sequenceName, int initialValue, int incrementSize) после этого смотреть, какие выдаст еще ошибки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2015, 15:39 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
AndreyDmt, если очень хочется использовать firebird, ничего не меняя в метаданных, то можно в проект добавить такой класс Код: java 1. 2. 3. 4. 5. 6. 7. 8. в persistence.xml, естественно, ссылаться на него, а не на org.hibernate.dialect.FirebirdDialect По-хорошему, данный код надо было бы добавить непосредственно в org.hibernate.dialect.Dialect, ено, видимо, разработчики hibernate используют firebird нечасто, раз этого до сих пор это не было сделано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2015, 16:07 |
|
||
|
wildfly, firebird - помогите подружить
|
|||
|---|---|---|---|
|
#18+
ivanra, Спасибо за Ваши советы. На счёт "очень хочется использовать" - как я уже писал в начале, это у меня было тестовое мероприятие. Ещё пару баз потестю, и успокоюсь. А решает как всегда заказчик, и кстати firebird - не самая любимая база при работе с java (я так думаю!). А Ваши посты я себе в подборочку соберу по теме: во первых они внесли некоторое просветление, а во вторых - может и пригодятся в жизни. А что, а вдруг... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2015, 07:52 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=120&tid=2125004]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 354ms |

| 0 / 0 |
