Как динамически добавлять Entity в спящий режим?
Я разработчик Java. Я использую spring 4.0.1 и hibernate 4.2.21. У меня есть класс следующим образом:
@Entity
@Inheritance(...)
public abstract class Feature{
@Id
@GeneratedValue
protected Long id;
...
}
Теперь у меня есть несколько классов, как показано ниже:
Класс Label.java:
@Entity
public class Label extends Feature{
protected String str;
...
}
Класс Point.java:
@Entity
public class Point extends Feature{
protected Integer intg;
...
}
У меня есть более 20 классов Entity, которые простираются от класса Feature
. Есть ли способ добавить динамически эти классы (например, Label
и Point
) в проект без написания жесткого кода?
обновление:
Например, Hibernate получает данные из базы данных, а затем, согласно этим данным, создает модели.
- Возможно ли это?
- Как мне сделать?
Ответы
Ответ 1
Я думаю, что это не очень хороший дизайн базы данных, который нужно динамически менять. Это звучит многословно и непротиворечиво. Соблюдайте свой домен снова и попытайтесь создать правильные отношения сущностей, которые не будут изменены в течение времени выполнения.
Ответ 2
Я думаю, что вы хотите сгенерировать свой класс сущности во время выполнения, вместо того, чтобы писать свой Java файл и компилировать его и т.д.
Если это ваше требование, вы можете использовать генератор байтового кода, например javassist, чтобы генерировать и комментировать файл класса во время выполнения. Затем вы можете сохранить его в своей таблице, используя JPA, Hibernate и любую другую структуру ORM. Я пишу базу генератора классов в файле xml. В последующие дни он будет завершен, и я дам вам ссылку на мой github. Таким образом, вы можете использовать это для генерации ваших классов сущностей. хорошо провести день:)
Ответ 3
Вы можете попытаться собрать необходимые данные для создания модели и сгенерировать файл hibernate hbm.xml
для каждого объекта (это формат xml и легко сгенерировать с помощью java после прочтения данных, необходимых вам, как описано в вашем обновлении)
После этого вы можете программно создать объект конфигурации спящего режима, следующий за этим http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-programmatic
Я думаю, что с таким подходом вы можете достичь того, чего хотите, если я хорошо понимаю ваш вопрос.
Ответ 4
Как я понимаю, вам нужно разработать инструмент, собирающий имена таблиц, которые имеют отношение "один к одному" с таблицей Feature
.
Мое предложение такое же (проверено в Oracle):
1) Из вашей базы данных получите метаданные таблиц, которые ссылаются на вашу таблицу функций.
Ниже будут напечатаны ваши метки, точки и т.д. Таблицы, которые имеют отношение внешних ключей к вашей таблице.
Если вы хотите генерировать только подмножество (у нерелевантных таблиц может быть это отношение тоже), возможно, вы помещаете common имя столбца внешнего ключа и отфильтровать несвязанные таблицы с помощью такой маркировки.
Connection connection = jdbcTemplate.getDataSource().getConnection();
DatabaseMetaData metaData = connection.getMetaData();
ResultSet exportedKeys = metaData.getExportedKeys(connection.getCatalog(), "<your_schema_name>", "FEATURE");
while (exportedKeys.next()){
String fkTableName = exportedKeys.getString("FKTABLE_NAME");
String fkColumnName = exportedKeys.getString("FKCOLUMN_NAME");
System.out.println("[fkTableName:" + fkTableName + "], [fkColumnName" + fkColumnName + "]");
}
exportedKeys.close();
2) Для таблиц, которые вы собрали выше, для каждой таблицы нашей озабоченности, получите метаданные таблицы для типов и столбцов.
ResultSet columns = metaData.getColumns(connection.getCatalog(), "<your_schema_name>", "<your_table_name>", null);
while (columns.next()){
String columnName = columns.getString("COLUMN_NAME");
String typeName = columns.getString("TYPE_NAME");
System.out.println("[columnName:" + columnName + "], [typeName" + typeName + "]");
}
columns.close();
3) По результатам из 2 генерируют ваши Java-классы. С полями, установками getter, аннотациями и т.д. Затем скопируйте их в исходный каталог. Вы знаете все остальное:)
Надеюсь, что это будет полезно.
Ответ 5
Я думаю, вы можете использовать Hibernate Reverse Engineering для создания Entity для всех таблиц базы данных. Пожалуйста, обратитесь this Link. Это будет объяснять шаг за шагом процесс генерации сущности из базы данных с использованием обратной гибернации.
Ответ 6
Не повторяйте себя.
Если вам действительно нужны эти классы, используйте среду IDE (например, eclipse) для генерации классов. Или используйте generics и inheritance для создания только одного класса, который способен хранить строки и целые числа.
Но если вам действительно не нужны классы, сгенерируйте SQL (не JPQL или HQL) и сохраните данные в java.util.Map
и аналогичных структурах данных.
Классы подходят для:
- тип безопасности
- объединение логики (методов) с данными (полями)
- описание отношений
В вашем случае вам может понадобиться только:
- хранить структурированные данные во время выполнения.
Ответ 7
Я думаю, вы могли бы сделать это с помощью eclipse, но классы должны были быть изменены более или менее, чтобы сохранить иерархию наследования.
- Righ щелкните по имени проекта и выберите Свойства
- Использовать грань проекта, если фаски проекта не включены.
![введите описание изображения здесь]()
-
Нажмите JPA, если он не выбран, затем нажмите ОК, чтобы закрыть окно свойств проекта.
-
После включения JPA в свойствах проекта теперь щелкните правой кнопкой мыши имя проекта eclipse снова, вы увидите новый элемент контекстного меню Инструменты JPA. Выберите Создать сущности из таблиц
![введите описание изображения здесь]()
Выберите соединение с базой данных, чтобы позволить Eclipse получить таблицы, используемые для создания
класс из.
Вот как настроить db в eclipse
-
Лучше создать объекты в фиктивном проекте с использованием вышеуказанного метода и скопировать классы Entity в реальный проект.
-
Рефакторинг класса Eclipse может использоваться для сохранения иерархии наследования, которую вы хотите.
Надеюсь, что это поможет.