重试repository.save()时发生staleobjectstateexception

ztyzrc3y  于 2021-07-09  发布在  Java
关注(0)|答案(0)|浏览(256)

我为一个问题挣扎了好几个月。我需要从数据库中复制一组对象/文件,并将其保存为新示例。例如,一个学生实体有许多依赖实体。所有依赖实体中都有这么多文件。因此,我创建了对象的副本并调用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:行被另一个事务更新或删除(或者未保存的值Map不正确)
我必须重新保存这张唱片。我怎么能那样做。如何回滚上一个。我是冬眠的初学者。我真的在努力解决这个问题。请帮忙

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题