首页 > 其他分享 >Hibernate自定义注解类

Hibernate自定义注解类

时间:2022-10-17 15:04:37浏览次数:70  
标签:hibernate java 自定义 import Hibernate org 注解

• 介绍
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">​​

标签:hibernate,java,自定义,import,Hibernate,org,注解
From: https://blog.51cto.com/suren/5762921

相关文章