为了便于二次开发新增表字段,定义了OverrideExsitsBean,凡是标记此注解的Bean都将覆盖其父类,框架需要实现所有的HQL查询返回的都是派生类的实例。实现此功能,自然要扩展Hibernate。
首先是对Hibernate的SessionFactory——AnnotationSessionFactoryBean进行扩展:
public class AnnotationSessionFactoryBeanExt extends AnnotationSessionFactoryBean {
public AnnotationSessionFactoryBeanExt() {
setAnnotationConfigurationExtClass(AnnotationConfigurationExt.class);
}
public void setAnnotationConfigurationExtClass(Class configurationClass) {
if (configurationClass == null || !AnnotationConfigurationExt.class.isAssignableFrom(configurationClass)) {
throw new IllegalArgumentException(
"AnnotationSessionFactoryBean only supports AnnotationConfigurationExt or subclasses");
}
super.setConfigurationClass(configurationClass);
}
@Override
protected void postProcessAnnotationConfiguration(AnnotationConfiguration config)
throws HibernateException {
super.postProcessAnnotationConfiguration(config);
AnnotationConfigurationExt configExt = (AnnotationConfigurationExt)config;
Map<String, Object[]> mapOverrideMsg = new HashMap<String, Object[]>();
Map<String, String> mapRedirect = new HashMap<String, String>();
// 扫描
for(Iterator iterKey = configExt.getClasses().keySet().iterator(); iterKey.hasNext();) {
String key = (String)iterKey.next();
PersistentClass rootClass = (PersistentClass)configExt.getClasses().get(key);
if(rootClass instanceof Subclass) {
Integer overrideValue = getOverrideValue(key);
if(overrideValue != null) {
PersistentClass originalClass = rootClass.getSuperclass();
while(getOverrideValue(originalClass.getEntityName()) != null) {
originalClass = originalClass.getSuperclass();
}
String originalEntityName = originalClass.getEntityName();
if(mapOverrideMsg.get(originalEntityName)==null
|| overrideValue>(Integer)mapOverrideMsg.get(originalEntityName)[1]) {
mapOverrideMsg.put(originalEntityName, new Object[]{rootClass, overrideValue});
}
mapRedirect.put(key, originalEntityName);
}
}
}
// 清理
Map<String, String> mapRedirectTmp = new HashMap<String, String>();
for(Iterator<String> iterKey=mapRedirect.keySet().iterator(); iterKey.hasNext(); ) {
String key = (String)iterKey.next();
configExt.getClasses().remove(key);
String originalEntityName = mapRedirect.get(key);
String overrideEntityName = ((Subclass)mapOverrideMsg.get(originalEntityName)[0]).getEntityName();
if(key.equals(overrideEntityName)) {
iterKey.remove();
mapRedirectTmp.put(originalEntityName, overrideEntityName);
} else {
mapRedirectTmp.put(key, overrideEntityName);
}
}
//修正重定向信息
mapRedirect.putAll(mapRedirectTmp);
configExt.setMapRedirect(mapRedirect);
// 修改
Map<String, String> mapFinalReserve = new HashMap<String, String>();
for(Iterator<String> iterKey=mapOverrideMsg.keySet().iterator(); iterKey.hasNext(); ) {
String originalEntityName = (String)iterKey.next();
Subclass rootClass = (Subclass)mapOverrideMsg.get(originalEntityName)[0];
PersistentClass newRootClass = CreateNewRootClass(rootClass, originalEntityName);
configExt.getClasses().put(originalEntityName, newRootClass);
mapFinalReserve.put(rootClass.getClassName(), originalEntityName);
}
configExt.setMapFinalReserve(mapFinalReserve);
}
protected PersistentClass CreateNewRootClass(Subclass templateClass, String originalEntityName) {
PersistentClass originalClass = templateClass;
Stack<Iterator> lstPropertyIters = new Stack<Iterator>();
while(!originalClass.getEntityName().equals(originalEntityName)) {
lstPropertyIters.push(templateClass.getUnjoinedPropertyIterator())