实现自己的扫描hibernate 标签类

本文介绍了一种在Spring框架中使用Hibernate进行Entity类自动扫描的方法。通过自定义`ScanAnnotationSessionFactoryBean`类,实现自动注册指定包路径下的所有带有`@Entity`注解的类。这种方式简化了Hibernate配置,并提供了灵活的包扫描机制。
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;

import org.hibernate.cfg.AnnotationConfiguration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

/**
 * 自动扫描Entity
 * @author Administrator
 *
 */
public class ScanAnnotationSessionFactoryBean
        extends
        org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean {

    public ScanAnnotationSessionFactoryBean() {
    }

    private List scanAnnotatedClasses = new ArrayList();

    public void setAnnotatedScanPackages(String[] packages) {
        for (String packageName : packages) {
            scanAnnotatedClasses.addAll(getClasses(packageName));
        }
    }

    @Override
    protected void postProcessAnnotationConfiguration(
            AnnotationConfiguration config) {
        for (int i = 0; i < this.scanAnnotatedClasses.size(); i++) {
            config.addAnnotatedClass((Class) scanAnnotatedClasses.get(i));
        }
    }

    private List getClasses(String packageName) {
        ResourcePatternResolver rl = new PathMatchingResourcePatternResolver();
        List result = new ArrayList();
        try {
            String packagePart = packageName.replace('.', '/');
            String classPattern = "classpath*:/" + packagePart + "/**/*.class";
            Resource[] resources = rl.getResources(classPattern);
            for (int i = 0; i < resources.length; i++) {
                Resource resource = resources[i];
                String fileName = resource.getURL().toString();
                String className = fileName.substring(
                        fileName.indexOf(packagePart.substring(0, packagePart
                                .indexOf('*'))),
                        fileName.length() - ".class".length())
                        .replace('/', '.');
                Class type = Class.forName(className);
                if (isEntityClass(type))
                    result.add(type);
            }
        } catch (IOException e) {
            fatal(e);
            return null;
        } catch (ClassNotFoundException e) {
            fatal(e);
            return null;
        }
        return result;
    }

    private boolean isEntityClass(Class type) {
        if (type.isAnnotationPresent(Entity.class) && !type.isInterface()
                && !isAbstract(type) && !type.isAnonymousClass()
                && !type.isMemberClass()) {
            return true;
        }
        return false;
    }

    boolean isAbstract(Class type) {
        return (type.getModifiers() ^ Modifier.ABSTRACT) == 0;
    }

    private void fatal(Throwable e) {
        throw new IllegalStateException("scan hibernate annotation error", e);
    }



}

spring配置文件中如下配置:

<bean id="sessionFactory" class="com.ether.common.domain.ScanAnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation"
            value="classpath:hibernate.cfg.xml" />
        
        <!-- annotatedScanPackages可以自动搜索某个package的全部标记@Entity class -->
        <property name="annotatedScanPackages">
            <list>
                <value>com.ether.**.model</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=${hibernate.dialect}
                hibernate.query.substitutions=true 'Y', false 'N'
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.use_query_cache=true
                hibernate.show_sql=${hibernate.format_sql}
                hibernate.format_sql=${hibernate.show_sql}
                hibernate.hbm2ddl.auto=${hibernate.hbm2ddl.auto}
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
                hibernate.jdbc.batch_size=50
            </value>
        </property>
    </bean>


内容概要:本文系统梳理了多个科研领域的前沿研究与技术实现,重点涵盖FDTD方法中的完美匹配层(PML)研究,以及Matlab/Simulink在电磁、电力、控制、通信、信号处理、图像处理、路径规划、能源系统优化等领域的仿真与算法实现。文中列举了大量基于Matlab和Python的科研案例,如风电功率预测、负荷预测、无人机三维路径规划、电池系统故障诊断、雷达模拟、通信编码、微电网优化调度等,强调结合智能优化算法(如粒子群、遗传算法、深度学习等)提升系统性能。同时,提供了丰富的代码资源与仿真模型,涵盖永磁同步电机控制、逆变器设计、多智能体任务配、虚拟电厂调度等复杂系统,助力科研人员快速开展复现实验与创新研究。; 适合人群:具备一定编程基础,熟悉Matlab/Python工具,从事电气工程、自动化、通信、人工智能、新能源、控制科学等相关领域研究的研发人员及研究生。; 使用场景及目标:① 学习实现FDTD仿真中的PML边界条件以有效抑制数值反射;② 掌握Matlab/Simulink在多物理场建模、控制系统设计与优化算法中的综合应用;③ 借助提供的代码资源完成科研复现、课程设计、竞赛项目或工程原型开发; 阅读建议:此资源以科研实战为导向,不仅提供理论方法,更强调代码实现与仿真验证。建议读者结合自身研究方向,按目录顺序查阅相关模块,下载配套代码进行调试与二次开发,以达到学以致用、融会贯通的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值