#java #hibernate #orm
#java #гибернация #orm
Вопрос:
У меня есть приложение, полное реальных данных. Я хотел бы предоставить интерфейс администратора, который может добавлять новые столбцы, индексы и так далее в таблицы базы данных.
Но, конечно, данные уже вставлены. Могу ли я каким-то образом динамически добавлять новые поля в классы сопоставления и переназначать их во время выполнения? Так что мне не нужно останавливать сервер, перекомпилировать, развернуть и запустить его снова?
Или это слишком низкоуровневая вещь, связанная с гибернацией?
Ответ №1:
Насколько я экспериментировал, пытаясь решить подобную проблему однажды, вы можете выполнить новую конфигурацию #configure только во время выполнения -> создать из нее новую SessionFactory -> создать новые сеансы с отражением новой конфигурации. Это решение сработало нормально. Однако я не нашел решения, как распространить эти изменения на существующий экземпляр SessionFactory.
Комментарии:
1. Вы можете делать все, что захотите, при создании новой конфигурации, это гибко. Например, в моем случае я даже создал новые файлы .class (используя процедуры динамической компиляции) amp; mappings (.hbm.xml — по-старому, поскольку именно так работало приложение), поместил их в classpath и выполнил новую конфигурацию().configure. В вашем случае, когда вы хотите добавить новые столбцы, вы могли бы рассмотреть возможность инструментирования ваших классов среды выполнения (не уверен, как это будет работать, но попробовать все же стоит).
2. впечатлен вашей компиляцией в памяти. должно быть, это вызвало проблемы с управлением версиями и т.д., Но все равно впечатлило
![]()
3. @Bohemian Sarcasm? Я думаю, мы говорим о времени выполнения. В моем случае это были простые объекты среды выполнения, которые, как упоминалось, определялись конечными пользователями и хранились в виде простых файлов определения в рабочем каталоге приложения. Кстати, это была не совсем компиляция в памяти, сохраненные файлы .java были скомпилированы с использованием утилиты JavaCompiler, но я думаю, что в памяти также должно быть возможно.
4. Я согласен, что это своего рода черная магия.. Есть и другие проблемы. Например, Настройка #configure займет довольно много времени для выполнения (одна из основных причин, по которой мы отказались от этой функции и применили другое дизайнерское решение). Дайте нам знать, что вы решили / внедрили, когда все закончится
![]()
5. Честно говоря, мне не нравится сама идея позволить кому-то возиться с базой данных, которая уже находится в рабочей среде (даже если это не критически важно, это довольно неубедительно) … Я обязательно дам вам знать, может быть, я выберу raw JDBC или вызову демонов или что-то еще…