1

休止状態を使用してデータベースに書き込むアプリケーションを作成しようとしていますが、一部のアクションでは、HB によって作成されたテーブルのデータに対して JDBC を使用する必要があります。

JDBS は、指定されたタイプの処理されたドキュメントの数、成功/失敗したログイン試行の数、または注文の製品の合計値など、データベース内のデータに関する統計情報を返す SQL クエリを作成する管理者機能を提供するために必要です。

そのために、toString() をオーバーライドして素敵な SQL クエリ文字列を返すクラスを作成できるようにしました。すべてが機能しますが、管理者がテーブル/列名を選択できるようにすることで、管理者の生活を楽にしようとしています。これらは休止状態によって作成されるため、ここに問題があります。@column アノテーションによるものもあれば、フィールド名によるものもあります。フィールドのマッピング方法を確認するにはどうすればよいですか? リフレクションについてはすべて知っていますが、Java ではまだその多くを行っていません。

@Entity
@Table(name= "my_table_name" )
public class TableOFSomething implements Serializable{
   //This field isn't mapped into database and info about it is not requred.
   //In fact, info about it may cause an error.
   private static final long serialVersionUID = 7L;

   @Id
   @Column(name="id")
   private String id;

   private String fieldOne;

   @Column(name="field_two")
   private String fieldTwo;

   @Column(name="renamed_just_for_fun")
   private int Number;

   //code with getters & setters
}

のような定義を持つメソッドの書き方

public <T> String tableName(Class<T> Target); //returns name of table in database
public <T> ArrayList<String> tabelFields(Class<T> Target); //returns name of fields in database
4

2 に答える 2

2

Hibernate には、マッピングを調査できる getClassMetadata という API があります。APIは変更される可能性があり、現在は別の場所にありますが、これを反映するのではなく使用します。詳細については、この投稿を参照してください: Hibernate のモデルからテーブル名を取得する

リフレクションが必要な場合は、このリンクを使用してください

于 2012-08-02T07:12:20.237 に答える
0
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

import javax.persistence.Column;
import javax.persistence.Table;

import odi.beans.statistic.QueryBean;

public class ReflectionTest {
    public static void main(String[] args) {
        ReflectionTest test=new ReflectionTest();
        System.out.println("Table name of "+QueryBean.class.getName()+" is "+test.getTableName(QueryBean.class));
        System.out.println("Column names in this table are:");
        for(String n: test.getColumnNames(QueryBean.class)){
            System.out.println("\t"+n);
        }
        System.out.println("Good bye ;)");
    }

    public <T> ArrayList<String> getColumnNames(Class<T> target) {
        ArrayList<String> ret=new ArrayList<>();
        Field[] fields = target.getDeclaredFields();
        String fieldName =null;
        for (Field f : fields) {
            //jump to next if if field is static
            if (Modifier.isStatic(f.getModifiers()))
                continue;
            if (f.isAnnotationPresent(Column.class)) {
                Column a = f.getAnnotation(Column.class);
                fieldName = a.name();
            } else {
                fieldName = f.getName();
            }
            ret.add(fieldName);
        }
        return ret;
    }

    public <T> String getTableName(Class<T> target){
        String ret=target.getSimpleName();
        if (target.isAnnotationPresent(Table.class))
        {
            Table t=target.getAnnotation(Table.class);
            ret=t.name();
        }
        return ret;
    }
}

それはすべての可能性をカバーしていますか?Hibernate の方が簡単であることはわかっていますが、これは非常に便利なリフレクション メカニズムの学習でもあります :)

編集:重要な質問:これは注釈または xml マッピングでのみ機能しますか?

于 2012-08-02T07:34:11.583 に答える