有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Hibernate更新有时不起作用

我需要根据uuid更新行,其中一个uuid可能与多个行关联

以下是场景: 4a90558c-4a5b-4af7-8c68-60ff81f74ef3是我的uuid,它存在于我的数据库中的8列中

我的java代码如下:

    try{
        session = sessionFactory.getCurrentSession();
        tx = session.getTransaction();
        criteria = session.createCriteria(Archive.class);
        criteria.add(Restrictions.eq("bagUuid",  "4a90558c-4a5b-4af7-8c68-60ff81f74ef3"));
        ScrollableResults items = criteria.scroll();

         while ( items.next() ) {
             Archive archive = (Archive)items.get(0);
             archive.setDecision(1);
             archive.setOperatorAssigned("test");
             session.saveOrUpdate(archive);
             session.flush();
             session.clear();
         }
         tx.commit();
        LOGGER.info("Archive Record is updated: "+archive.getFilePath());
    }catch(Exception e){
        recordUpdated = false;
        tx.rollback();
        LOGGER.error("Archive Record failed to update due to exception in updateArchiveRecord method: "+e.getMessage());
    }

在这里,与UUID关联的所有记录有时都在更新,但有时会失败。 我认为这可能是HibernateAPI的问题。 有没有其他人也面临过同样的问题


共 (1) 个答案

  1. # 1 楼答案

    这条线看起来可疑:

    Archive archive = (Archive)items.get(0);
    

    这意味着,不管ScrollableResults中有多少项,您将只更新第一个存档对象。如果我理解了您试图正确执行的操作,则应该是当前记录:

    Archive archive = (Archive)items.get();
    

    此外,我会移出/删除会话。flush()和session。清除()。最终的代码如下所示:

    try{
        session = sessionFactory.getCurrentSession();
        tx = session.getTransaction();
        criteria = session.createCriteria(Archive.class);
        criteria.add(Restrictions.eq("bagUuid",  "4a90558c-4a5b-4af7-8c68-60ff81f74ef3"));
        ScrollableResults items = criteria.scroll();
    
         while ( items.next() ) {
             Archive archive = (Archive)items.get();
             archive.setDecision(1);
             archive.setOperatorAssigned("test");
             session.saveOrUpdate(archive);
         }
         tx.commit();
         session.close();
        LOGGER.info("Archive Record is updated: "+archive.getFilePath());
    }catch(Exception e){
        recordUpdated = false;
        tx.rollback();
        LOGGER.error("Archive Record failed to update due to exception in updateArchiveRecord method: "+e.getMessage());
    }
    

    斯拉瓦·伊梅舍夫