动态加载来自hbm文件的所有类

时间:2013-04-17 05:27:29

标签: hibernate

如何使用自定义的类加载器加载* .hbm.xml文件中出现的所有类?

如何找到课程发生的所有地方?

1 个答案:

答案 0 :(得分:0)

对于Hibernate 3.6(我不知道它是否为Hibernate 4.x而改变):

您可以做什么:使用您自己的子类扩展类org.hibernate.cfg.Configuration。在这个类中,您可以覆盖方法doConfigure()buildSessionFactory()以注入您自己的自定义类加载器:

@Override
protected Configuration doConfigure(org.dom4j.Document doc) throws HibernateException {
    Thread me = Thread.currentThread();
    ClassLoader stdLoader = me.getContextClassLoader();
    me.setContextClassLoader(new MyOwnClassloader(...));
    super.doConfigure(doc);
    me.setContextClassLoader(stdLoader);

    return this;
}

buildSessionFactory()相同。

如果您愿意,也可以覆盖addResource()。这允许您接受类加载器的特殊语法,在何处查找映射文件或带注释的类。 (当我进行OSGi集成时,我这样做。在映射文件名中,我允许OSGi包的规范在哪里找到映射文件。)

在您的代码中,您必须使用对类的调用替换对休眠Configuration类的调用。

糟糕的是Hibernate Configuration类的面向对象设计不佳。许多方法返回this,i。即它们被调用的实例,但在创建子类后,这些方法返回错误Java类型的this。您必须覆盖所有这些方法,只需调用super.xxx()并在子类的类型中返回this