1

我试图编写一个使用hibernate写入数据库的应用程序,但是在某些操作中,我必须对HB制作的表中的数据使用JDBC。

JDBS 需要赋予管理员创建 SQL 查询的能力,该查询将返回有关数据库中数据的统计信息,例如指定类型的已处理文档的数量、成功/失败的登录尝试次数或订单中产品的总值。

为此,我已经完成了一个允许创建覆盖 toString() 并返回漂亮的 sql 查询字符串的类。所有的作品,但现在我试图通过让管理员能够选择表/列名来让管理员生活得更轻松。这是一个问题,因为它们是由hibernate创建的。一些由@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 有 API - getClassMetadata 可以探索映射。API 可能会更改并且现在位于另一个地方,但我将使用它而不是为此进行反思。查看这篇文章了解更多详情: Get the table name from the model in 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;
    }
}

是否涵盖了所有可能性?我现在知道休眠方式会更容易,但这也是学习非常有用的反射机制:)

编辑:重要问题:这仅适用于注释还是也适用于 xml 映射?

于 2012-08-02T07:34:11.583 回答