1. 程式人生 > >hibernate 獲取實體的表名、主鍵名、列名(轉載+修改)

hibernate 獲取實體的表名、主鍵名、列名(轉載+修改)

package com.escs.utils;

import java.util.Iterator;  

import org.hibernate.cfg.AnnotationConfiguration;  
import org.hibernate.cfg.Configuration;  
import org.hibernate.mapping.Column;  
import org.hibernate.mapping.PersistentClass;  
import org.hibernate.mapping.PrimaryKey;  
import org.hibernate.mapping.Property;  
  
  
/** 
 * 功能描述:根據實體類得到對應的表名、主鍵名、欄位名工具類 
 * </p> 
 * 注:po類名須與對應對映檔名一致,即Student.java與Student.hbm.xml<br> 
 * //修改為主註解方式,此hbm檔案已經不需要 
 *  
 *  
 * @Date:Nov 10, 2008 
 * @Time:3:13:07 PM 
 *  
 */  
public class EntityUtil {  
  
 private static Configuration hibernateConf;  
  
 private static Configuration getHibernateConf() {  
  if (hibernateConf == null) {  
         hibernateConf=new Configuration();//*.hbm.xml方式  
//        hibernateConf=new AnnotationConfiguration().configure();//註解方式  
//        hibernateConf.buildSessionFactory();//註解方式必須的  
  }  
  return hibernateConf;  
 }  
  
 private static PersistentClass getPersistentClass(Class<?> clazz) {  
  synchronized (EntityUtil.class) {  
   PersistentClass pc = getHibernateConf().getClassMapping(  
     clazz.getName());  
   if (pc == null) {  
  hibernateConf = getHibernateConf().addClass(clazz);//*.hbm.xml方式 註解方式去掉這個  
    pc = getHibernateConf().getClassMapping(clazz.getName());  
  
   }  
   return pc;  
  }  
 }  
  
 /**  
  * 功能描述:獲取實體對應的表名  
  *   
  * @param clazz  
  *            實體類  
  * @return 表名  
  */  
 public static String getTableName(Class<?> clazz) {  
  return getPersistentClass(clazz).getTable().getName();  
 }  
 
 /**
  * 獲取指定列的列名
  * @param clazz
  * @param num
  * @return
  */
 public static String getColumnName(Class<?> clazz,int num) {  
	  return getPersistentClass(clazz).getTable().getColumn(num).getName();  
	 }  
  
 /** 
  * 功能描述:獲取實體對應表的主鍵欄位名稱,只適用於唯一主鍵的情況 
  *  
  * @param clazz 
  *            實體類 
  * @return 主鍵欄位名稱 
  */  
 public static String getPrimaryKey(Class<?> clazz) {  
  
  return getPrimaryKeys(clazz).getColumn(0).getName();  
  
 }  
   
 /** 
  * 功能描述:獲取實體對應表的主鍵欄位名稱 
  *  
  * @param clazz 
  *            實體類 
  * @return 主鍵物件primaryKey ,可用primaryKey.getColumn(i).getName() 
  */  
 public static PrimaryKey getPrimaryKeys(Class<?> clazz) {  
  
  return getPersistentClass(clazz).getTable().getPrimaryKey();  
  
 }  
  
 /** 
  * 功能描述:通過實體類和屬性,獲取實體類屬性對應的表字段名稱 
  *  
  * @param clazz 
  *            實體類 
  * @param propertyName 
  *            屬性名稱 
  * @return 欄位名稱 
  */  
 public static String getColumnName(Class<?> clazz, String propertyName) {  
  PersistentClass persistentClass = getPersistentClass(clazz);  
  Property property = persistentClass.getProperty(propertyName);  
  Iterator<?> it = property.getColumnIterator();  
  if (it.hasNext()) {  
   Column column = (Column) it.next();  
   return column.getName();  
  }  
  return null;  
 }  
  
  
}  

 上述方法可以用個掃描註解的方式進行查詢表名以及指定列名  也可以通過掃描配置檔案(*.hbm.xml)進行獲取表名以及指定列名

測試:

//獲取指定列名    
Class clz=Class.forName("com.escs.entity."+"res_00201".toUpperCase()); System.out.println(EntityUtil.getColumnName(clz,0));