下面是我的代码:
@SuppressWarnings("unchecked")
public List<?> get(String hql, Object[] args) {
Session s = sf.getCurrentSession();
List<T> rslt = null;
Transaction ts = s.beginTransaction();
try {
Query q = s.createQuery(hql);
for (int i = 0; i < (args == null ? 0 : args.length); ++i) {
q.setParameter(i, args[i]);
}
s.flush();
rslt = (List<T>)(q.list());
// ts.commit();
} catch (HibernateException e) {
ts.rollback();
log.error("从数据库中获取所有数据时出错!", e);
e.printStackTrace();
}
// if(rslt == null)
// throw new RecordNotFoundException();
return rslt;
}
以下是详细出错信息:java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$ValueIterator.next(HashMap.java:822)
at org.hibernate.pretty.Printer.toString(Printer.java:113)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:120)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at cn.ijser.DAO.Impl.BaseDAO.get(BaseDAO.java:136)
at cn.ijser.Services.UserGroupService.getByName(UserGroupService.java:91)
at cn.ijser.InitDataTest.insertUser(InitDataTest.java:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)诡异的是:有时候我DEBUG一步一步,就不会出错,而直接运行基本总会出这个错。。在网上也查了半天,无果。怎么办呢?

解决方案 »

  1.   

     就是q.list()的时候出错,就在这里。再深入就进Hibernate的源码了,我实在没办法了。求救哎
      

  2.   

    public List<T> get(String hql, Object[] args) {
    List<T> rslt = new ArrayList<T>();
    Session s = sf.getCurrentSession();
    Transaction ts = s.beginTransaction();
    try {
    Query q = s.createQuery(hql);
    for (int i = 0; i < (args == null ? 0 : args.length); ++i) {
    q.setParameter(i, args[i]);
    }
    for(Iterator<T> it = q.iterate(); it.hasNext();) {
    rslt.add(it.next());
    }
    // rslt = (List<T>)(q.list());
    // ts.commit();
    } catch (HibernateException e) {
    ts.rollback();
    log.error("从数据库中获取所有数据时出错!", e);
    e.printStackTrace();
    }
    // if(rslt == null)
    // throw new RecordNotFoundException();
    return rslt;
    }采用这种方式便可以,谁能给解释下呢?