文档章节

Hibernate自定义注解类

素人派
 素人派
发布于 2016/12/31 20:48
字数 466
阅读 7
收藏 0
  • 介绍
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">

本文转载自:http://surenpi.com/2016/06/15/hibernate_diy_annotation_class/

上一篇: WatchService
素人派
粉丝 26
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
使用Hibernate-Validator优雅的验证RESTful Web Services的参数

何为Hibernate-Validator 在RESTful Web Services的接口服务中,会有各种各样的入参,我们不可能完全不做任何校验就直接进入到业务处理的环节,通常我们会有一个基础的数据验证的机制,待这些...

宥轻
2018/08/13
0
0
【补充】Hibernate validator使用和自定义validator及整合Spring MVC

Hibernate validator使用 导入validation-api-xxx.jar 以及 hibernate-validator-xxx.Final.jar 需要检查的java bean Entity.java 值校验的测试类 输出结果 这里有一个国际化的key值,国际化文...

jason_wu_2
2016/12/27
387
0
Hibernate框架学习之注解映射实体类

前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了...

Single_YAM
2017/11/13
0
0
关于hibernate的一些小记

最近接触的老项目,总是爱用hibernate,维护起来觉得很麻烦,这里随便总结一下hibernate的特点。 首先: 1.hibernate可以直接对java实例操作,达到数据库的增删改查作用,但是这个实例,只对...

杨健-YJ
02/21
0
0
baomidou/hibernate-plus

为简化开发工作、提高生产率而生 简介 | Intro Hibernate 增强工具包 - 只做增强不做改变,更加精简持久层操作 技术讨论 QQ 群 492238239 如满,加群 121472998 (有钱的捧个钱场【点击捐赠】...

baomidou
2016/12/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

我最喜欢的Mybatis 3.5新特性——Optional支持

Mybatis 3.5 发布有段时间了,终于支持了 Optional ,这么实用的特性,竟然还没人安利……于是本文出现了。 文章比较简单,但非常实用,因为能大量简化恶心的判空代码。 WARNING 由于本文非常...

周立_ITMuch
31分钟前
6
0
Android 开发工具推荐

简评: 自己过去在 Android 开发中发现的好工具,在这里分享给大家。: ) Library methods count 每一个 Android App 的开发中都会用到很多的库,这个工具能够让你看到不同库的大小和,帮助你...

极光推送
32分钟前
1
0
高并发解决方案

我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键。举个例子,我们假设处理一个业务请求平均响应时间为100...

孤狼悲月
38分钟前
1
0
Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署

本文首发于:Jenkins 中文社区 渐进式交付是持续交付的下一步, 它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估, 如果不匹配某些关键指标,则进行回...

Jenkins中文社区
42分钟前
5
0
大数据辟谣:布洛芬用药不慎可能致死?如此标题党居心何在

相信很多人看到一则“布洛芬用药不慎可能致死”的消息后,内心开始慌乱了。 (新闻来源:微博热搜排行榜) 毕竟健康是每一个人最关注的话题,而布洛芬也是很多人止痛(发烧头痛、喉咙痛、牙痛...

forespider
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部