Hibernate3升级到Hibernate4后的修改点
>>hibernate.cfg.xml
1, 修改DTD文件地址:将http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd 修改成 http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
修改前:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
修改后:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
2,移除org.hibernate.hql.ast.ASTQueryTranslatorFactory。(Hibernate v4.x中已经不在使用此类)
移除配置:
<property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
>>*.hbm.xml
同样需要修改DTD文件地址:将http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd 修改成 http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
>>如果存在如下手动读取配置文件的代码(使用场景:取得某实体对应表的字段名称),则同样需要相应调整。
修改前:
List<String> list = new ArrayList<String>(); Configuration cfg = new Configuration(); cfg.addResource("com/xxx/orm/dwprod/breport/BReportDwOrdersPl.hbm.xml"); PersistentClass clazz = cfg.getClassMapping("com.xxx.orm.dwprod.breport.BReportDwOrdersPl"); Iterator<Column> iterator = clazz.getTable().getColumnIterator(); while (iterator.hasNext()) { list.add(iterator.next().getName()); } return list;
修改后:
List<String> list = new ArrayList<String>(); Configuration cfg = new Configuration(); cfg.addResource("com/xxx/orm/dwprod/breport/BReportDwOrdersPl.hbm.xml"); cfg.buildMappings(); Iterator<PersistentClass> classIterator = cfg.getClassMappings(); while(classIterator.hasNext()){ PersistentClass clazz = classIterator.next(); Iterator<Column> columnIterator = clazz.getTable().getColumnIterator(); while (columnIterator.hasNext()) { list.add(columnIterator.next().getName()); } } return list;
注意:在Hibernate v4.x后需要使用cfg.buildMappings();来手动构建mapping的相关信息,否则仅仅是加入了resource是不能读取相关信息的。同时,另一个重要变化是Hibernate v4.x会读取映射配置文件里的其它实体关联信息(如:many-to-one...),所以需要在构建之前将此映射文件的关联信息一一加入进来,否则构建mapping信息是会出错。这里的例子仅仅是一个单独的实体映射,不存在其它关联。