Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在Jaxrs资源上添加@Transactional时发生异常_Hibernate_Jpa_Quarkus - Fatal编程技术网

Hibernate 在Jaxrs资源上添加@Transactional时发生异常

Hibernate 在Jaxrs资源上添加@Transactional时发生异常,hibernate,jpa,quarkus,Hibernate,Jpa,Quarkus,在Quarkus资源中,我尝试在响应中编写Java 8流 我为流类型创建了MessageBodyWriter @Provider 公共类StreamBodyWriter实现MessageBodyWriter{ @上下文 私人供应商; @凌驾 公共布尔值可写(类类型、类型genericType、, 注释[]注释,MediaType(MediaType){ 返回Stream.class.isAssignableFrom(类型); } @凌驾 公共长getSize(流、类类型、类型genericTyp

在Quarkus资源中,我尝试在响应中编写Java 8流

我为流类型创建了MessageBodyWriter

@Provider
公共类StreamBodyWriter实现MessageBodyWriter{
@上下文
私人供应商;
@凌驾
公共布尔值可写(类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
返回Stream.class.isAssignableFrom(类型);
}
@凌驾
公共长getSize(流、类类型、类型genericType、,
注解[]注解,MediaType MediaType){return-1;}
@凌驾
public void writeTo(流、类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值映射HttpHeader,OutputStream entityStream)
抛出IOException、WebApplicationException{
Object obj=stream.collect(Collectors.toList());
类objType=obj.getClass();
MessageBodyWriter=提供者。getMessageBodyWriter(objType,
null、注释、mediaType);
writeTo(obj,objType,null,注解,
mediaType、HttpHeader、entityStream);
}
}
流需要一个jdbc游标才能工作,并且需要事务支持

我确信我已经安装了postgres jdbc扩展,并且应用程序启动时没有错误

@Transactional
公众回应getAllPosts(
@QueryParam(“q”)字符串q,
@QueryParam(“offset”)@DefaultValue(“0”)int offset,
@QueryParam(“size”)@DefaultValue(“10”)int size
) {
返回ok(this.posts.findByKeyword(q,偏移量,大小)).build();
}
@ApplicationScoped
公共类PostRepository实现了PanacheRepositoryBase{
公共流findByKeyword(字符串q、整数偏移量、整数大小){
if(q==null | | q.trim().isEmpty()){
返回this.streamAll(Sort.descending(“createdAt”))
.跳过(偏移)
.限制(尺寸);
}否则{
返回this.streamAll(Sort.descending(“createdAt”))
.filter(p->p.title.contains(q)| | p.content.contains(q))
.跳过(偏移)
.限制(尺寸);
}
}
@实体
公共类Post实现了可序列化{
@身份证
@GeneratedValue(generator=“uuid”)
@GenericGenerator(name=“uuid”,strategy=“uuid2”)
字符串id;
字符串标题;
字符串内容;
LocalDateTime创建数据;
当我在资源上添加CDI@Transactional时,在开始阶段出现以下错误

[38;5;203m: org.jboss.resteasy.spi.UnhandledException: org.hibernate.exception.GenericJDBCException: could not advance using next()
        at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:381)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:209)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:587)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:508)
        at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:252)
        at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:153)
        at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:363)
        at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:156)
        at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:238)
        at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:249)
        at io.quarkus.resteasy.runtime.ResteasyFilter$ResteasyResponseWrapper.sendError(ResteasyFilter.java:64)
        at io.undertow.servlet.handlers.DefaultServlet.doGet(DefaultServlet.java:175)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:686)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:791)
        at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
        at io.quarkus.resteasy.runtime.ResteasyFilter.doFilter(ResteasyFilter.java:28)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
        at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
        at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
        at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
        at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
        at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
        at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
        at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
        at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
        at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
        at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.server.handlers.PathHandler.handleRequest(PathHandler.java:91)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
        at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
        at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
        at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$9$1$1.call(UndertowDeploymentRecorder.java:513)
        at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
        at io.undertow.servlet.handlers.ServletInitialHandler.handleRequest(ServletInitialHandler.java:174)
        at io.undertow.server.handlers.HttpContinueReadHandler.handleRequest(HttpContinueReadHandler.java:65)
        at io.quarkus.undertow.runtime.UndertowDeploymentRecorder$1.handleRequest(UndertowDeploymentRecorder.java:92)
        at io.undertow.server.handlers.CanonicalPathHandler.handleRequest(CanonicalPathHandler.java:49)
        at io.quarkus.undertow.deployment.devmode.UndertowHotReplacementSetup.handleHotDeploymentRequest(UndertowHotReplacementSetup.java:85)
        at io.quarkus.undertow.deployment.devmode.UndertowHotReplacementSetup$1$1.handleRequest(UndertowHotReplacementSetup.java:61)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
        at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
        at io.quarkus.runtime.CleanableExecutor$CleaningRunnable.run(CleanableExecutor.java:224)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2011)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1535)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1395)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at java.base/java.lang.Thread.run(Thread.java:834)
        at org.jboss.threads.JBossThread.run(JBossThread.java:479)
Caused by: org.hibernate.exception.GenericJDBCException: could not advance using next()
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
        at org.hibernate.internal.ScrollableResultsImpl.convert(ScrollableResultsImpl.java:70)
        at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:105)
        at org.hibernate.query.internal.ScrollableResultsIterator.hasNext(ScrollableResultsIterator.java:33)
        at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1811)
        at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
        at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
        at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
        at com.example.StreamBodyWriter.writeTo(StreamBodyWriter.java:39)
        at com.example.StreamBodyWriter.writeTo(StreamBodyWriter.java:17)
        at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:193)
        at org.jboss.resteasy.core.interception.jaxrs.ServerWriterInterceptorContext.writeTo(ServerWriterInterceptorContext.java:64)
        at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:155)
        at org.jboss.resteasy.core.ServerResponseWriter.lambda$writeNomapResponse$2(ServerResponseWriter.java:156)
        at org.jboss.resteasy.core.interception.jaxrs.ContainerResponseContextImpl.filter(ContainerResponseContextImpl.java:405)
        at org.jboss.resteasy.core.ServerResponseWriter.executeFilters(ServerResponseWriter.java:232)
        at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:97)
        at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:70)
        at org.jboss.resteasy.core.SynchronousDispatcher.writeResponse(SynchronousDispatcher.java:578)
        ... 59 more
Caused by: java.sql.SQLException: ResultSet is closed
        at io.agroal.pool.wrapper.ResultSetWrapper$1.invoke(ResultSetWrapper.java:49)
        at com.sun.proxy.$Proxy81.next(Unknown Source)
        at io.agroal.pool.wrapper.ResultSetWrapper.next(ResultSetWrapper.java:85)
        at org.hibernate.internal.ScrollableResultsImpl.next(ScrollableResultsImpl.java:100)
        ... 79 more


当您使用实体方法返回
流时,您需要让该方法在事务中处理它

在代码中,情况并非如此,因为流是由
StreamBodyWriter
处理的,而
collect()
方法就在这里


要解决此问题,您必须在
getAllPosts
findByKeyword
方法中处理流。因此,请摆脱
StreamBodyWriter
,并从rest端点返回一个集合。

当您使用实体方法重新处理
流时,您需要让该方法处理它进行交易

在代码中,情况并非如此,因为流是由
StreamBodyWriter
处理的,而
collect()
方法就在这里


要解决此问题,您必须在
getAllPosts
findByKeyword
方法中处理流。因此,请摆脱
StreamBodyWriter
,并从rest端点返回一个集合。

并且您已经按照文档中所述设置了属性?@SimonMartinelli我刚刚清理了代码,并运行了应用程序再次获得更新的异常。奇怪的是,如果我删除所有
@Transactional
,结果将返回,但我不确定它是否基于光标来获取结果。从打印日志中,它查询所有结果。看看这里,您已经按照文档中所述设置了属性?@SimonMartinelli我刚刚清理了我的代码s、 然后再次运行应用程序,得到更新的异常。奇怪的是,如果我删除所有的
@Transactional
,结果会返回,但我不确定它是否基于光标来获取结果。从打印日志中,它会查询所有结果。看看这里,我知道这种方法是可行的,但如何在StreamBodyWriter?Y中使流正常工作您不能,它需要是事务的一部分,Quarkus上的事务实现基于CDI拦截器,该拦截器将拦截带有
@Transactional
注释的方法调用。我不认为您的
StreamBodyWriter
可以是事务的一部分,因为它将在您的JAX-RS资源之外使用(定义交易的一个)通过resteasy。我知道这种方法是可行的,但如何使流在StreamBodyWriter中工作良好?你不能,它需要成为事务的一部分,Quarkus上的事务实现基于CDI拦截器,它将拦截用
@Transactional
注释的方法调用。我不认为你的
StreamBodyWriter
可以是事务的一部分,因为它将由resteasy在JAX-RS资源(定义事务的资源)之外使用。