2009-07-28 3 views
3

У меня есть требование в моем приложении. Мои таблицы не будут определены заранее. Например, если пользователь создает форму по имени Student и добавляет ее атрибуты, такие как имя, roll no, subject, class и т. Д., Тогда во время выполнения должна быть таблица, созданная по имени student with имя столбца, номер рояля, субъект, класс, а также связанный с ним класс и его файл сопоставления спящего режима. Есть ли способ сделать это?Динамически создавать классы таблицы и java во время выполнения

Спасибо заранее,

Римма Десаи

ответ

3

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

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

EDIT:

После О.П. разъяснения лучший подход заключается в использовании XML для хранения пользовательских данных, определенных. Вышеприведенное решение является хорошим, но требует повторной компиляции приложения, изменились ли формы. Если вы не хотите останавливаться и перекомпилировать после каждого редактирования пользователем, XML гораздо лучше отвечает.

Чтобы дать вам фору:

@Entity 
public class UserDefinedFormData { 
    @Id 
    private long id; 

    @ManyToOne 
    private FormMetadata formMetadata; 

    @Lob 
    private String xmlUserData; 
} 

Учитывая определение вида было бы тривиально, чтобы сохранить и загрузить данные сохраняются в виде XML.

Добавьте комментарий, если вы хотите получить дополнительные разъяснения.

+0

Hi Gregory, Спасибо за ваше предложение. я определенно проверю скорость. Причиной этого является создание механизма, в котором пользователь может создавать формы, а затем использовать их. Таким образом, при создании форм, если можно создать таблицу и связанный с ней класс, стало бы легко хранить данные при использовании форм. Rima Desai – 2009-07-28 05:59:42

+0

я вижу. Я отредактирую ответ с лучшим подходом для вас. –

+0

Вот упражнение: скажем, я добавил атрибуты «имя», «адрес» и «почтовый код» и сохранил их в XML-лове для нескольких миллионов пользовательских записей или так - как именно я собираюсь получить всех с именем «Грегори», живущим в 10 почтовых кодах и сортировкой результатов по имени? – ChssPly76

3

Hibernate поддерживает dynamic models, то есть объекты, определенные во время выполнения, но вы должны записать файл сопоставления. Следует отметить пару вещей о динамических моделях:.

  1. Вы можете быть ограничены в том, как вы определить эти во время выполнения (а именно вы должны будете использовать Session непосредственно вместо того, чтобы использовать вспомогательный метод из HibernateTemplate или что-то в этом роде).

  2. Динамические модели поддерживаются с использованием Map s в качестве контейнера для полей объекта, поэтому вы теряете типизацию и API-интерфейс POJO во время выполнения (не делая ничего, кроме поддержки динамической модели) ,

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

1

на прошлой неделе я искал то же решение, а затем я получил идею от com.sun.tools.javac.Main.compile класса, вы создаете класс сущностей с помощью java IO и компилировать с помощью java tools, для этого вам нужно tools.jar найти на CLASS_PATH, теперь я ищу время выполнения hibernate отображение без перезагрузки. кто-то говорил в сообщении относительно этого требования, что «но не понятно, почему вы хотите сделать что-то подобное» ответ это требование для CMS(Content Management System). и я делаю то же самое. код выглядит следующим образом.

public static void createClass() 
{ 
String methodName=“execute”; 
String parameterName=“strParam”; 
try{ 
//Creates DynamicTestClass.java file 
FileWriter fileWriter=new FileWriter(fileName,false); 
fileWriter.write(“public class “+ className +” {\n”); 
fileWriter.write(“public String “+methodName +“(String “+parameterName+“) {\n”); 
fileWriter.write(“System.out.println(\” Testing\”);\n”); 
fileWriter.write(“return “+parameterName +“+ \” is dumb\”;\n }\n}”); 
fileWriter.flush(); 
fileWriter.close(); 

String[] source = { new String(fileName) }; 
com.sun.tools.javac.Main.compile(source); 
} 
Смежные вопросы