2015-11-25 3 views
16

Я разработчик Java. Я использую spring 4.0.1 и hibernate 4.2.21. У меня есть класс следующим образом:Как динамически добавлять Entity в спящий режим?

@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; 

    ... 
} 

У меня есть mo re чем 20 Класс сущностей, который простирается от класса Feature. Есть ли способ добавить динамически эти классы (например, Label и Point) в проект без написания жесткого кода?

обновление:

Например, Hibernate получить данные из базы данных, а затем согласно этому данные, создавать модели.

  1. Возможно ли это?
  2. Как мне сделать?
+2

Постарайтесь описать вашу проблему лучше? Если бы я понял, что вы говорите, вы можете сгенерировать все сущности автоматически, используя jpa-инструменты в своем идее. – Skizzo

+0

Что вы подразумеваете под 'Существует способ динамически добавлять эти классы (такие как Label и Point) в проект без сложного написания код? ' Я думаю, что теперь вы должны быть знакомы с тем, как задавать вопрос! – SyntaX

+1

У меня есть более 20 объектов, которые расширяют форму 'Feature'. Я хочу, чтобы при развертывании проекта он автоматически генерировал все эти классы. –

ответ

5

Я думаю, что вы хотите сгенерировать свой класс сущности во время выполнения, вместо того, чтобы писать свой Java-файл и компилировать его и т. Д. Если это ваше требование, вы можете использовать генератор байтового кода, например javassist, чтобы генерировать и комментировать файл класса во время выполнения. Затем вы можете сохранить его в своей таблице, используя JPA, Hibernate и любую другую структуру ORM. Я пишу базу генератора классов в файле xml. В последующие дни он будет завершен, и я дам вам ссылку на мой github. Таким образом, вы можете использовать это для генерации ваших классов сущностей. у меня хороший день :)

+0

Привет, ваш проект завершен? – bilak

+0

Вы закончили свой генератор? Работает ли она так, как ожидалось? – mrgenco

1

Я думаю, вы могли бы сделать это с помощью eclipse, но классы должны были быть изменены более или менее, чтобы сохранить иерархию наследования.

  • Righ нажмите на название проекта и выберите Свойства
  • аспекты использования проекта, если проект Грани не включен

enter image description here

  • Нажмите JPA, если это не затем нажмите OK, чтобы закрыть окно свойств проекта.

  • После включения JPA в свойствах проекта теперь щелкните правой кнопкой мыши название проекта затмения еще раз, вы увидите новый пункт контекстного меню Появятся инструменты JPA.Выберите Генерирование сущностей из таблиц

enter image description here

Выберите соединение с базой данных, чтобы позволить Eclipse, получить таблицы, используемые в генерируемый класса из.

Вот how to setup db in eclipse

  • Это лучше создавать объекты в фиктивном проекте с использованием описанным выше способом и скопировать классы сущностей в реальный проект.

  • Рефакторинг класса Eclipse может использоваться для сохранения иерархии наследования, которую вы хотите.

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

2

Я думаю, вы можете использовать Hibernate Reverse Engineering для создания Entity для всех таблиц базы данных. См. this Ссылка. Это будет объяснять шаг за шагом процесс генерации сущности из базы данных с использованием hibernate reverse engineering.

6

Я думаю, что это не очень хороший дизайн базы данных, который нужно динамически менять. Это звучит многословно и непротиворечиво. Соблюдайте свой домен снова и попытайтесь создать правильные отношения сущностей, которые не будут изменены в течение времени выполнения.

3

Как я понял, вам необходимо разработать инструмент, который собирает имена таблиц, которые имеют взаимно-однозначное отношение с таблицей Feature.

Мое предложение подобное (протестировано с Oracle):

1) Из вашей БД, получить таблицы метаданных, который referancing таблицы Feature. Ниже будут напечатаны ваши метки, точки и т. Д. Таблицы, которые имеют отношение внешних ключей к вашей таблице.
Если вы хотите сгенерировать только подмножество (у нерелевантных таблиц может быть это отношение тоже), возможно, вы ставите общее имя столбца внешнего ключа и отфильтровываете несвязанные таблицы с помощью такой маркировки.

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, аннотациями и т. Д. Затем скопируйте их в исходный каталог. Вы знаете все остальное :)

Надеюсь, это полезно.

+0

Это хорошая идея, но на третьем этапе генерации классов Java недостаточно для сохранения объектов во время выполнения. Вам необходимо скомпилировать сгенерированные исходные файлы inorder для их использования. – mrgenco

2

Не повторяйте себя.

Если вам действительно нужны эти классы, используйте IDE (например, eclipse) для генерации классов. Или используйте generics и inheritance для создания только одного класса, который способен хранить строки и целые.

Но если вы действительно не используете классы, сгенерируйте SQL (не JPQL или HQL) и сохраните данные в java.util.Map и аналогичные структуры данных.

Классы хороши для:

  • безопасности типа
  • сочетающей логики (методы) с данными (поля)
  • , описывающие отношения

В вашем случае вам может понадобиться только:

  • хранить структурированные данные в во время выполнения.
5

Вы можете попытаться собрать необходимые данные для построения модели и создания файла гибернации hbm.xml для каждого объекта (это формат XML и легко создать с Явы после чтения данных, необходимых, как вы описали в своем обновлении)

После этого, вы можете создать программно объект конфигурации спящего режима после этой http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-programmatic

Я думаю, что с таким подходом вы можете добиться того, что вы хотите, если я хорошо понимаю ваш вопрос.