Как динамически добавлять 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 может использоваться для сохранения иерархии наследования, которую вы хотите.

Надеюсь, что это поможет.