您现在的位置是:主页 > news > 太原开发网站公司/网络营销的特征
太原开发网站公司/网络营销的特征
admin2025/4/21 0:18:56【news】
简介太原开发网站公司,网络营销的特征,企业官网制作报价,wordpress模板上传介绍 Hibernate对PO类上支持的注解类是有限的,而且我用的这个版本的Hibernate还不支持在生成数据库表(通过hibernate.hbm2ddl.auto)时生成字段注释(comment)。本文通过扩展AnnotationSessionFactoryBean和AnnotationC…
- 介绍
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/