Hibernate自定义注解类

2016/12/31 20:48
阅读数 326
  • 介绍
Hibernate对PO类上支持的注解类是有限的,而且我用的这个版本的Hibernate还不支持在生成数据库表(通过hibernate.hbm2ddl.auto)时生成字段注释(comment)。 本文通过扩展AnnotationSessionFactoryBean和AnnotationConfiguration来实现的,如果各位看客还有更好的主意的话,还希望能多多交流。
  • 例子
[codesyntax lang="java"]
package gboat2.example.action;

import org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean;

/**
 * @author surenpi.com
 * @since jdk1.6
 * 2016年6月12日
 */
public class SuRenAnnotationSessionFactoryBean extends AnnotationSessionFactoryBean {

	@Override
	public void setConfigurationClass(Class<?> configurationClass) {
		super.setConfigurationClass(SuRenConfiguration.class); //这里把Configuration对象设置为自定义的
	}

}
[/codesyntax] 下面是AnnotationConfiguration的扩展类实现: [codesyntax lang="java"]
package gboat2.example.action;

import gboat2.base.core.annotation.Comment;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;

import javax.persistence.Column;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.dialect.Dialect;
import org.hibernate.mapping.Property;
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.Table;
import org.hibernate.tool.hbm2ddl.DatabaseMetadata;

/**
 * 使得Hibernate可以识别PO类中自定义的注解类
 * @author surenpi.com
 * @since jdk1.6
 * 2016年6月12日
 */
public class SuRenConfiguration extends AnnotationConfiguration {

	/**  */
	private static final long serialVersionUID = 1L;
	
	/**
	 * 如果Hibernate配置了hibernate.hbm2ddl.auto为update的话就会执行该方法
	 */
	@Override
	public String[] generateSchemaUpdateScript(Dialect dialect, DatabaseMetadata databaseMetadata) throws HibernateException {
		//遍历所有添加了Entity注解的类
		Iterator it = classes.values().iterator();
		while(it.hasNext()){
			RootClass rootCls = (RootClass)it.next();
			Table table = rootCls.getTable();
			Class<?> mappedCls = rootCls.getMappedClass();

			Iterator proIt = rootCls.getPropertyIterator();
			while(proIt.hasNext()){
				Property pro = (Property)proIt.next();
				
				Field field;
				try {
					field = mappedCls.getDeclaredField(pro.getName());
					
					Comment commentAno = field.getAnnotation(Comment.class);
					if(commentAno == null){
						continue;
					}
					
					//自定义注解中设置的字段注释
					String comment = commentAno.value();
					
					//这里要获取PO类属性对应的getter方法
					Method method = mappedCls.getMethod(String.format("get%s%s",
							pro.getName().substring(0, 1).toUpperCase(),
							pro.getName().substring(1)));
					Column colAnno = method.getAnnotation(Column.class);
					if(colAnno == null){
						continue;
					}
					
					String colName = colAnno.name();
					Iterator colIt = table.getColumnIterator();
					while(colIt.hasNext()){
						org.hibernate.mapping.Column col = (org.hibernate.mapping.Column)colIt.next();
						
						//找到没有添加注释的列并通过自定义的注解来设置注释
						if(colName.equals(col.getName()) && StringUtils.isEmpty(col.getComment())){
							try {
								col.setComment(comment);
							} catch (SecurityException e) {
								e.printStackTrace();
							}
							
							break;
						}
					}
				} catch (NoSuchFieldException e) {
					e.printStackTrace();
				} catch (SecurityException e) {
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					e.printStackTrace();
				}
			}
		}
		
		return super.generateSchemaUpdateScript(dialect, databaseMetadata);
	}
}
[/codesyntax] 如果是使用的Hibernate和Spring集成的话,就需要把spring配置文件中的SessionFactoryBean的配置修改为上面自定义的类: <bean id="sessionFactory" class="gboat2.example.action.SuRenAnnotationSessionFactoryBean">
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部