在项目开发中采用Hibernate3注解方式实现关于一些配置和可扩展的总结:在Hibernate中配置中使用的SessionFactory中AnnotationSessionFactoryBean而不在使用HibernateTemplate模版类。
在非注解类中必须实现必须在配置对HibernateTemplate进行配置然后在DAO中使用时注入HibernateTemplate对象。但是在注解中就不在使用而是使用AnnotationSessionFactoryBean配置即可不必在每一个类中配置。
在配置文件中必须配置的数据源和AnnotationSessionFactoryBean类。
在注解的DAO中Dao层类继承HibernateDaoSupport通过创建抽象的类封装注解SessionFactory类,实现基础的接口不需要在每一个类中添加同样的注入
@Autowired
public final void setSessionFactoryExtend(SessionFactory sessionFactory) {
setSessionFactory(sessionFactory);
}
减轻底层类的代码编写量!!
AnnotationSessionFactoryBean 如下:
public class AnnotationSessionFactoryBean extends LocalSessionFactoryBean implements ResourceLoaderAware ;
通常使用只需配置中添加datasource和packagesToScan即可
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="datasource"/>
</property>
<property name="packagesToScan">com.XX.xx</property>
</bean>
在AnnotationSessionFactoryBean 源代码中三个属性:
private Class[] annotatedClasses; //注解的类
private String[] annotatedPackages; //注解的类包
private String[] packagesToScan; //扫描的类包
private TypeFilter[] entityTypeFilters = new TypeFilter[] {
new AnnotationTypeFilter(Entity.class, false),
new AnnotationTypeFilter(Embeddable.class, false),
new AnnotationTypeFilter(MappedSuperclass.class, false)};
可选的选由:
private Resource[] configLocations;
private String[] mappingResources;
private Resource[] mappingLocations;//Hibernate的额外的配置如:自定义数据类型,枚举类型的应用等配置
private Resource[] cacheableMappingLocations;
private Resource[] mappingJarLocations;
private Resource[] mappingDirectoryLocations;
private Properties hibernateProperties;//Hibernate的属性设置:如show_sql=true,hibernate.dialect,format_sql hibernate.default_batch_fetch_size,hibernate.cache.use_query_cache等
private TransactionManager jtaTransactionManager; //事务管理器
private CacheProvider cacheProvider;//缓存提供器的应用
private LobHandler lobHandler; //lob数据处理器
private Interceptor entityInterceptor; //实体拦截器
private NamingStrategy namingStrategy; //表名称的命名策略
private TypeDefinitionBean[] typeDefinitions;
private FilterDefinition[] filterDefinitions;
private Properties entityCacheStrategies;
private Properties collectionCacheStrategies;
private Map eventListeners;
private boolean schemaUpdate = false; //schemaUpdate
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
private Configuration configuration;
Spring中lob处理器
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler"/>
缓存提供处理者:
<bean id="hibernate.cacheProvider" class="org.hibernate.cache.HashtableCacheProvider"/>
如果你想让项目中注解生成的类的名称以特殊的前缀必须重写ImprovedNamingStrategy中某些方法实现:
ImprovedNamingStrategy 如下:
public class ImprovedNamingStrategy implements NamingStrategy, Serializable ;
重写中重点方法如下:
@Override
public String classToTableName(String className) {
return prependPrefix(super.classToTableName(className));
}
@Override
public String tableName(String tableName) {
return prependPrefix(super.tableName(tableName));
}
@Override
public String logicalCollectionTableName(
String tableName,
String ownerEntityTable,
String associatedEntityTable,
String propertyName) {
return prependPrefix(
super.logicalCollectionTableName(
tableName,
ownerEntityTable,
associatedEntityTable,
propertyName
)
);
}
在项目中通过对针对AnnotationSessionFactoryBean 的扩展使其支持正则表达式匹配。