让人郁闷的org.hibernate.MappingException: duplicate import......

最近用Hibernate3.0开发一个项目时,遇到了个郁闷的org.hibernate.MappingException: duplicate import....异常;

于是想尽一切办法想解决这个问题,可能的问题原因:

1. Hibernate配置文件、Hibernate mapping文件错误;根据字面理解是hibernate mapping配置文件重复加载,于是搜寻整个应用,期望能找到两个同样的mapping配置文件,当然结果是失望的(事实证明,这招是错误的,对Hibernate的理解和应用还远没到位);

2.在WEB应用更新前后,系统出现问题,又怀疑是相关jar包的问题,最后也被一一排除;

好费力啊,几个人折腾了到夜里10点多,毫无头绪.........定位不到根本原因.....头大...

3. 在一个偶然的机会,发现了问题可能发生的原因:一个java文件A更改过,在A中增加了一个final static a,在a初始化的时候需要查询数据库,问题就出现在这个地方,将该段代码注释掉,重新启动系统,一切OK。

开始分析原因,系统访问数据库,调用A类中的方法,于是调用HibernateSessionFactory中的currentSession()方法中,由于是系统第一次访问数据库,于是进行Hibernate的初始化,加载Hibernate.cfg.xml、Hibernate mapping等配置文件,在A类已经加载,但整个Hibernate mapping加载尚未完成的时候,JVM同时会初始化A中的 final static a 变量,由于该变量同样要访问currentSession()方法,在第一次初始化未完成的时候,根据currentSession()中的逻辑判断,将会出现duplicate import的异常。

附上HibernateSessionFactory中的 currentSessio()方法:

   /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

  if (session == null || !session.isOpen()) {
   if (sessionFactory == null) {
    try {
     cfg.configure(CONFIG_FILE_LOCATION);
     sessionFactory = cfg.buildSessionFactory();
    } catch (Exception e) {
     System.err
       .println("%%%% Error Creating SessionFactory %%%%");
     e.printStackTrace();
    }
   }
   session = (sessionFactory != null) ? sessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

        return session;
    }

 

不知道说的清不清楚,如果您不清楚,那表明我自己都没有搞清楚,不过还是希望能帮助到一些人。

如有什么疑问或建议,请留言或者E-mail我,谢谢wengal@163.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值