0

我正在使用resteasy并使用hibernate保存blob

我已经在视图中配置了打开的会话

我的休息处理程序是非事务性的,我检索 java.sql.blob 的服务是事务性的。

问题:在服务中检索 blob 后 jdbc-connection 被 HibernateTransactionManager:doCleanupAfterCompletion 关闭(休眠会话未关闭)

所以 rest 以后不能读取 blob 流,因为它只有在相同的 jdbc-connection 仍然打开时才有效

在事务性服务功能之后,我如何休眠教不关闭 jdbc 连接?

会话关闭时应该关闭它

4

1 回答 1

0

我通过为 Blob 创建一个 Provider 来解决它,从 InputSTream-Provider 采用

@Provider
@Produces("*/*")
public class BlobProvider implements MessageBodyWriter<Blob> {

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return Blob.class.isAssignableFrom(type);
    }

    public long getSize(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    public void writeTo(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
        SessionFactory sessionFactory = (SessionFactory) Utils.getBean("sessionFactory");
        sessionFactory.getCurrentSession().beginTransaction();
        InputStream inputStream = null;
        try {
            inputStream = blob.getBinaryStream();
            int c = inputStream.read();
            if (c == -1) {
                httpHeaders.putSingle(HttpHeaderNames.CONTENT_LENGTH, Integer.toString(0));
                entityStream.write(new byte[0]); // fix RESTEASY-204
                return;
            } else
                entityStream.write(c);
            ProviderHelper.writeTo(inputStream, entityStream);
        } catch (SQLException e) {
            Utils.logError(e);
        } finally {
            if (inputStream != null)
                inputStream.close();
        }
        sessionFactory.getCurrentSession().getTransaction().commit();
    }
}
于 2013-11-11T13:37:41.220 回答