1. 程式人生 > >Hibernate 判斷物件是否包含一個欄位

Hibernate 判斷物件是否包含一個欄位

applicationContext.xml

<bean id="hibernateConfigurationUtil" class="com.cn.test.hb.HibernateConfigurationUtil"></bean>

HibernateConfigurationUtil

package com.cn.test.hb;

import java.util.Iterator;

import org.hibernate.MappingException;
import org.hibernate.cfg.Configuration;
import
org.hibernate.mapping.Column; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Property; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.orm.hibernate4.LocalSessionFactoryBean; /** * 根據實體類得到對應的表名、主鍵名、欄位名(與Spring整合) * 這裡使用xml檔案配置的對映,需要保證實體類名與對應對映檔名一致,即User.java與User.hbm.xml * </p> * 這裡使用繼承ApplicationContextAware的方式來獲得ApplicationContext, * 因此需要在Spring配置檔案中配置一下該類,才能自動注入ApplicationContext物件 * * <bean class="util.HibernateConfigurationUtil"/> */
public class HibernateConfigurationUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; private static Configuration configuration; public static Configuration getConfiguration() { if (configuration == null) { // 取sessionFactory的時候要加上&
LocalSessionFactoryBean factory = (LocalSessionFactoryBean) applicationContext .getBean("&sessionFactory"); configuration = factory.getConfiguration(); } return configuration; } private static <T> PersistentClass getPersistentClass(Class<T> clazz) { synchronized (HibernateConfigurationUtil.class) { PersistentClass pc = getConfiguration().getClassMapping( clazz.getSimpleName()); if (pc == null) { configuration = configuration.addClass(clazz); pc = configuration.getClassMapping(clazz.getName()); } return pc; } } /** * 獲得實體類對應的表名 * * @param clazz * 實體類的Class物件 * @return 表名 */ public static <T> String getTableName(Class<T> clazz) { return getPersistentClass(clazz).getTable().getName(); } /** * 獲得實體類對應表的主鍵欄位名稱 * * @param clazz * 實體類的Class物件 * @return 主鍵欄位名稱 */ public static <T> String getPKColumnName(Class<T> clazz) { return getPersistentClass(clazz).getTable().getPrimaryKey() .getColumn(0).getName(); } /** * 獲得類屬性對應的欄位名 * * @param clazz * 實體類的Class物件 * @param propertyName * 實體類的屬性名 * @return 屬性對應的欄位名 */ public static <T> String getColumnName(Class<T> clazz, String propertyName) { String columnName = ""; PersistentClass persistentClass = getPersistentClass(clazz); Property property; try{ property = persistentClass.getProperty(propertyName); } catch(MappingException e) { return null; } Iterator<?> iterator = property.getColumnIterator(); if (iterator.hasNext()) { Column column = (Column) iterator.next(); columnName += column.getName(); } return columnName; } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { applicationContext = context; } }

使用

String column =  HibernateConfigurationUtil .getColumnName(TestModel.class,'columnName');
if(column==null)//欄位不存在