实现自己的扫描hibernate 标签类

来源:互联网 发布:不需要交钱的网络兼职 编辑:程序博客网 时间:2024/06/05 08:52
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>


原创粉丝点击