Создайте таблицу программно из аннотации объекта в JPA

Предположим, что провайдер JPA находится в спящем режиме. Предположим, что он управляется не контейнером, а приложением.

Учитывая класс сущности и правильную аннотацию, возможно ли создать таблицу программно, во время выполнения и только для этого класса? Говоря о среде выполнения, это означает, что класс сущности не указан в файле persistence.xml.

Теоретически это возможно, потому что мы можем вручную прочитать аннотации и сгенерировать SQL, а из модуля сохраняемости мы можем прочитать URL-адрес подключения к базе данных. Мой вопрос в том, есть ли способ сделать это без дублирования большого количества работы в спящем режиме?

В других вопросах SO я обнаружил, что можно использовать Persistence.createSchema, но я не вижу, где указать класс.


person Kan Li    schedule 31.05.2015    source источник
comment
Как ясно сказано в спецификации JPA, вызов Persistence.generateSchema принимает единицу персистентности, которая ОПРЕДЕЛЯЕТ, какие классы находятся в этой единице.   -  person Neil Stockton    schedule 31.05.2015
comment
@NeilStockton, как я уже сказал, я хотел бы, чтобы класс сущности не определялся в блоке сохраняемости, а указывался во время выполнения. Persistence.generateSchema принимает только имя единицы сохраняемости, как я могу добавить класс в единицу сохраняемости во время выполнения?   -  person Kan Li    schedule 31.05.2015


Ответы (1)


  1. Если файл persistence.xml не знает о вашей сущности (либо из ее явного списка, либо из автоматического сканирования), то никакая реализация JPA не сможет создать схему базы данных для t.

  2. Вы можете либо сгенерировать всю схему базы данных из аннотации JPA, либо не создавать ее для какой-либо сущности. Вы не можете создать определение таблицы только для одного объекта.

Ваш вариант использования пахнет взломом, и вам, вероятно, следует сначала выполнить требование.

person Vlad Mihalcea    schedule 31.05.2015
comment
Требование состоит в том, что система содержит подключаемые модули, которые можно загружать во время выполнения, поэтому объект нельзя жестко закодировать в файл persistence.xml. И не будет безумием избегать загрузки всех сущностей во всех плагинах, а только тех плагинов, которые нужны. Должен ли плагин загружаться, определяется во время выполнения. Является ли это требование взломом? Я так не думаю. - person Kan Li; 31.05.2015
comment
тогда вы знаете, как создать блок сохранения на лету? - person Kan Li; 31.05.2015
comment
Для этого вы можете использовать Spring: stackoverflow.com/questions/21381943/ - person Vlad Mihalcea; 31.05.2015
comment
Должен ли я вводить другую структуру? Разве я не могу просто придерживаться режима гибернации? - person Kan Li; 01.06.2015
comment
Нет, ты не можешь. Ни одна реализация JPA не предлагает такой возможности. Весна просто работает вокруг него. Вы можете кодировать его самостоятельно, но это не будет тривиально. Проверьте код Spring и посмотрите, как они это сделали. - person Vlad Mihalcea; 01.06.2015