2009-07-28 19 views
3

私のアプリケーションには要件があります。私のテーブルはあらかじめ定義されていません。たとえば、ユーザーが名前Studentでフォームを作成し、名前、ロール番号、件名、クラスなどの属性を追加すると、実行時に名前studentによって作成されたテーブルがあります。列名、ロール・ナンバー、サブジェクト、クラス、および関連するクラスとそのハイバネーション・マッピング・ファイルが含まれます。そうする方法はありますか?事前に実行時にテーブルとJavaクラスを動的に作成

おかげで、

Rimaのデサイ

答えて

3

ことは可能ですが、あなたがそのような何かをしたいと思う理由は明らかではないので、それは特定のソリューションを提案するのは難しいです。

しかし、一般的には、入力に基づいてデータベーステーブルを生成し、クラスとマッピングを動的に休止することができます。最も簡単なアプローチは、いくつかのテンプレートエンジンを使用することです。私は過去にVelocityを使用していましたが、この作業には非常に良いものでしたが、試してみると他にもあります。

EDIT:

はOPの明確化に続いてより良い方法では、ユーザー定義のデータにXMLを使用することです。 上記の解決策は良いですが、フォームが変更されるかどうかは、アプリケーションを再コンパイルする必要があります。各ユーザーの編集後に停止して再コンパイルしたくない場合は、XMLがはるかに良い答えです。あなたにいくつかの頭を与えること

が起動します。

XMLとして保存されたデータを保存してロードすることが希望些細なフォームの定義を考えると
@Entity 
public class UserDefinedFormData { 
    @Id 
    private long id; 

    @ManyToOne 
    private FormMetadata formMetadata; 

    @Lob 
    private String xmlUserData; 
} 

さらに詳しい説明が必要な場合は、コメントを追加してください。

+0

こんにちは、グレゴリー、 お寄せいただきありがとうございます。私は間違いなく速度をチェックするだろう。これを行う理由は、ユーザーがフォームを作成して後で使用できるエンジンを作成するためです。したがって、フォームを作成する際に、テーブルとそれに関連するクラスを作成することができれば、フォームの使用時にデータを保存するのが容易になります。 リーマデサイ –

+0

そうです。私はより良いアプローチで答えを編集します –

+0

"name"、 "address"、 "postalCode"属性を追加して数百万のユーザーレコードなどのXMLロブにそれらを保存したとします私は10の与えられた郵便番号に住んでいて名前の結果を並べ替える名字「グレゴリー」を持つみんなを得ることについてちょうどいいですか? – ChssPly76

3

Hibernateはdynamic modelsをサポートします。つまり、実行時に定義されるエンティティですが、マッピングファイルを書き出す必要があります。あなたは、動的モデルについてのカップルの事に注意してください。

  1. あなたは、実行時(すなわちでこれらの定義どのように制限されることがありますから、ヘルパーメソッドを使用して、直接の代わりSessionを使用する必要があります。 HibernateTemplateなど)。

  2. ダイナミックモデルは、エンティティのフィールドのコンテナとしてMapを使用することでサポートされているため、実行時にタイプインとPOJOスタイルのAPIが失われます(焼き付け動的モデルサポートを超えない) 。

これらのことは、動的に定義されたテーブルをアプリケーションセッション全体で永続化する必要があるかどうかは言いませんでした。それは物事を複雑にする可能性があります。

1

先週、私は同じソリューションを探していたし、私はcom.sun.tools.javac.Main.compileクラスからアイデアを得た、あなたはjava IOを使用してエンティティクラスを作成し、java toolsを使用してコンパイルし、このためにあなたがCLASS_PATHに検索するtools.jarを必要とする、今私は、実行時間を探しています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); 
} 
関連する問題