Hibernate3升级到Hibernate4后的修改点

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信息是会出错。这里的例子仅仅是一个单独的实体映射,不存在其它关联。

猜你喜欢

转载自jerval.iteye.com/blog/2249362