StaleObjectStateException при повторной попытке repository.save()

Я боролся с проблемой несколько месяцев. У меня есть требование продублировать набор объектов / файлов из моей БД и сохранить их как новые экземпляры. Скажем, студенческий объект с множеством зависимых объектов. Так много файлов присутствует во всех зависимых объектах. Итак, я делаю копию объекта и вызываю repositiry.save (). В случае успеха весь процесс сохранения занимает до 40 минут. Но в некоторых случайных пробегах он бросает

      java.io.IOException: Closed Connection
    at oracle.jdbc.driver.OracleBlobInputStream.needBytes(OracleBlobInputStream.java:204)
    at oracle.jdbc.driver.OracleBufferedStream.readInternal(OracleBufferedStream.java:169)
    at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:143)
    at oracle.jdbc.driver.OracleBufferedStream.read(OracleBufferedStream.java:132)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1158)
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:878)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1135)
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:854)
    at com.*.*.*.*.hibernate.BlobUserType.nullSafeSet(BlobUserType.java:209)
    at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:160)

Метод nullSafeSet приведен ниже.

      @Override
    public void nullSafeSet(PreparedStatement ps, Object value, int index, SharedSessionContractImplementor session)
            throws HibernateException, SQLException {

        
        if (value == null) {
            ps.setNull(index, Types.BLOB);
        } else {
            if (value instanceof FileUploadBlob) {
                FileUploadBlob fileUploadBlob = (FileUploadBlob) value;
                InputStream inputStream = fileUploadBlob.getBinaryStream();
                DatabaseMetaData dbMetaData = session.connection().getMetaData();
                String dbProductName = dbMetaData.getDatabaseProductName();
                if (dbProductName.toUpperCase().contains("ORACLE")) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    try {
                        IOUtils.copy(inputStream, baos);
                        InputStream is = new ByteArrayInputStream(baos.toByteArray());
                        ps.setBlob(index, is); // assume JDBC 3.0
                        
                        inputStream.close();
                        baos.close();
                    } catch (IOException e) {
                        LOG.error("Clone process interrupted due to IOException thrown :", e);
                    } catch (Exception e) {
                        LOG.error("Clone process interrupted due to Exception thrown :", e);
                    }
                }
            } else if (value instanceof Blob) {
                ps.setBlob(index, (Blob) value);
            } else {
                LOG.warn("Unknown BLOB type");
            }
        }
            
    }

Я изменил некоторые конфигурации и так и так, и ничего не работало.

Теперь в качестве обходного пути от контроллера я поймал исключение и повторил попытку сохранить тот же объект (который не удалось сохранить)

вызывая ошибку

org.hibernate.StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией (или отображение несохраненных значений было неправильным)

Я должен заново сохранить эту запись. Как мне это сделать. Как можно откатить предыдущую. Я новичок в спячке. Я действительно борюсь с этой проблемой. Пожалуйста помоги

1 ответ

Кажется, что ваш процесс пытается сделать это в рамках одной транзакции. Я бы не советовал делать это в нескольких небольших транзакциях. Таким образом, вы можете продолжить работу с того места, где произошел последний сбой, что важно, поскольку похоже, что исключение подключения вызвано слишком долгим открытым подключением или какой-либо сетевой проблемой. Я не знаю вашей транзакции и управления контекстом персистентности, но после возникновения исключения вы должны избавиться от контекста постоянства ( EntityManager/ Session) и создайте новый.

Другие вопросы по тегам