我不知道你这在哪里出问题了 ,我觉得你这两句
1. getSession().clear();  
2. getSession().createCriteria(clazz).list();
应该写反了吧...  换成这样
getSession().createCriteria(clazz).list();
getSession().clear();
后面直接不session关掉.
getSession().close();试试还是不行的话有一种办法就是控制锁,当有用户在操作表时,只有一个用户对他进行操作,其他用户等待...

解决方案 »

  1.   

    webapp1 上的事务提交了么?如果事务提交了,数据库里就真正插入了这条记录,再在webapp2 执行session.createQuery("查询的hql语句").list();这样是从数据库里查询返回的结果集中,包含表中的所有记录符合的记录
      

  2.   

    webapp1中注意提交事务,或者save后直接关闭session,如果还不行,就在webapp2中refresh()试试
      

  3.   

    在操作完成后session都是有关闭的
      

  4.   

    getSession().save(transientInstance);  你到数据库里看下到底有没有这条记录
      

  5.   

    webapp1增加完数据以后,把 webapp2 的 session关掉,从新建一个,然后再用getSession().createCriteria(clazz).list();  看看返回的是几条?
      

  6.   

    每次对数据库操作完成后。 session都是有关闭的。 getSession方法都是使用MyEclipse自动生成的HibernageFactory类中的openSession方法得到, 以为使用了ThreadLocal, 因此session也是新建的。 其实这个问题也可以这样重现: getSession().createCriteria(clazz).list();假如可以得到有1条记录; 然后用数据库客户端插入一条记录; 再getSession().createCriteria(clazz).list();仍然是1条记录!
      

  7.   

    //保存数据的
    public synchronized void   saveDepartment(Department dept1,Department dept2)throws Exception {
    Session session = sessionFactory.openSession();
    Transaction tx;
    try{
    System.out.println("保存数据!");
    Thread.sleep(5000);
    tx = session.beginTransaction();
    Criteria criteria = session.createCriteria(Department.class);
    List list = criteria.list();
    System.out.println("save 前表中记录数量=="+list.size());
    session.save(dept1);
    Criteria criteria2 = session.createCriteria(Department.class);
    List list2 = criteria2.list();
    System.out.println("save 后表中记录数量=="+list2.size());
    //session.save(dept2);
    tx.commit();
    }catch(HibernateException msg){
    System.out.println("save department is error");
    msg.printStackTrace();
    }catch(Exception msg){
    System.out.println("save department is error");
    throw msg;
    }finally{
    if(session!=null){
    session.close();
    }
    System.out.println("保存完成数据!");
    }
    }
      

  8.   

    //读取的
    public synchronized void getAll()throws Exception {
    Session session = sessionFactory.openSession();
    Transaction tx;
    try{
    System.out.println("读取数据!");
    Thread.sleep(5000);
    tx = session.beginTransaction();
    Criteria criteria = session.createCriteria(Department.class);
    List list = criteria.list();
    System.out.println("表中记录数量=="+list.size());
    tx.commit();
    }catch(HibernateException msg){
    System.out.println("save department is error");
    msg.printStackTrace();
    }catch(Exception msg){
    System.out.println("save department is error");
    throw msg;
    }finally{
    if(session!=null){
    session.close();
    }
    System.out.println("读取完成!");
    }
    }
      

  9.   

    //调用的
    public class Test implements Runnable{

    BasicEmpService emp = new EmployeeService();
    public static boolean b = true;

    public static void main(String[] args){ try{
    Test t = new Test();
    Thread t1 = new Thread(t);
    t1.start();
    Thread.sleep(100);
    b = false;
    Thread t2 = new Thread(t);
    t2.start();

    }catch(Exception msg){
    msg.printStackTrace();
    }
    }

    public void run(){

    if(b){
    int num = 0;
    while(num<10){
    try{
    emp.getAll();
    num++;
    }catch(Exception msg){ }
    }
    }else{
    int num = 0;

    Department d1 = new Department();
    d1.setName("Coding");

    while(num<10){
    try{
    emp.saveDepartment(d1, d1);
    num++;
    }catch(Exception msg){
    }
    }
    }
    }
    }
      

  10.   

    你在HIBERNATE配置文件中显示设置一下事务隔离级别
    例:<property name="connection.isolation">2</property>
    如果 "2" 不行的话,换成 "8" 试试
      

  11.   

    在默认webapp1的事务隔离级别下
    如果 webapp2 中的事务是在 webapp1 的插入之前开始的,  webapp2 的这个事务查询不到webapp1 刚刚插入的那条记录,即使 webapp1 事务已提交.
      

  12.   

    谢谢大家。 问题解决。 主要是
    getSession().createCriteria(clazz).list();
    没有放到事务里。
    不过我有点不明白
    list仅仅是个查询,问什么还有放到事务里去处理呢?