0

テーブルのメタデータ情報を取得しようとしています。テーブル内の列と列のタイプを取得することに成功しました。各列のサイズも取得したいと思います。私はHibernateにかなり慣れておらず、これに固執しています。これは私が列の名前とタイプを取得する方法です:

String[] columns = HibernateUtil.getSessionFactory()
            .getClassMetadata(Java.class).getPropertyNames();
Type[] columnsType = HibernateUtil.getSessionFactory()
            .getClassMetadata(Java.class).getPropertyTypes();

エンティティクラス:

@Entity
    @Table(name="Box")
    public class Box implements Serializable {
        private int dimHeight;
        private int dimLen;
        private int dimWidth;
        private double weight;

        public Box() {
        }

        public int getDimHeight() {
            return this.dimHeight;
        }

        public void setDimHeight(int dimHeight) {
            this.dimHeight = dimHeight;
        }

        public int getDimLen() {
            return this.dimLen;
        }

        public void setDimLen(int dimLen) {
            this.dimLen = dimLen;
        }

        public int getDimWidth() {
            return this.dimWidth;
        }

        public void setDimWidth(int dimWidth) {
            this.dimWidth = dimWidth;
        }

        public double getWeight() {
            return this.weight;
        }

        public void setWeight(double weight) {
            this.weight = weight;
        }
    }

コードと例外は次のとおりです。

Field foo = Box.class.getField("dimWidth");
foo.setAccessible(true);

java.lang.NoSuchFieldException: dimWidth
    at java.lang.Class.getField(Class.java:1520)
4

2 に答える 2

1

HibernateUtilそれを公開していません。ただし、そのためにJavaリフレクションを使用するだけで済みます。

Field foo = Java.class.getField("foo");
Column column = foo.getAnnotation(Column.class);
column.length();

アップデート

Grrrhh、ばかげた間違いをしました...getField()公のメンバーだけです。getDeclaredField()次のようなプライベートフィールドに使用する必要があります。

Field dimWidthField = Box.class.getDeclaredField("dimWidth");
Column columnAnnotation = dimWidthField.getAnnotation(Column.class);
System.out.println(columnAnnotation.length()); // 5
System.out.println(columnAnnotation.precision()); // 0

private class Box implements Serializable {
  @Column(length = 5, precision = 0)
  private int dimWidth;
于 2013-02-01T23:31:20.787 に答える
0

あなたは間違った場所を見ています。その名前が示すように、ClassMetadataには、データベーステーブルとその列ではなく、クラスに関するメタデータが含まれています。

テーブルの列に関する情報を取得するには、JDBCのDatabaseMetaDataを使用します。

于 2013-02-01T23:25:44.427 に答える