数据服务更新为HHH000346:托管刷新期间发生错误[null]

时间:2019-07-15 14:25:02

标签: hibernate grails gorm

我正在Grails应用程序中使用GORM数据服务。当我尝试更新域类的记录时,收到所述的休眠错误。接下来是更多信息。

域类:

package org.olr.nonadmin

import org.olr.admin.User
import org.olr.nonadmin.PlayerFile
import org.olr.nonadmin.QuestionFile

class Game {

    private static final long serialVersionUID = 1

//  Integer id // autogenerated
//  Integer version // autogenerated
    Date startTime  // start timestamp
    Date endTime // end timestamp
    QuestionFile questionFile // id of question file
    PlayerFile playerFile // id of player file (optional)
    Integer roomNo  // "room" in which game was played
    Integer gameType // 0 => Presentation Round, 1 => Open Round, 2 => Countdown Round
    Integer questionCount // number of questions asked
    Integer duration // duration in seconds
    String description // emcee's summary of game

    static belongsTo = [emcee: User]
    User emcee

    static constraints = {
        id generator: 'identity'  // added
        questionFile column: 'QUESTION_FILE_ID', nullable: false // NOT QUESTION_FILE_ID_ID
        playerFile column: 'PLAYER_FILE_ID', nullable:true
        startTime nullable: false
        endTime nullable: true
        emcee column: 'EMCEE_ID'
        roomNo sqlType: 'smallint', nullable: true
        gameType  sqlType: 'smallint'
        questionCount sqlType: 'smallint', nullable: true
        duration nullable:true
        description nullable:true
    }
}

服务:

package org.olr.nonadmin

import grails.gorm.services.Service
import org.olr.nonadmin.Game

@Service(Game)
interface GameService {

    Game updateGame(Serializable id, String description)
}

使用GameService的控制器代码:

package org.olr.nonadmin

import org.olr.nonadmin.GameTypeEnum
import org.olr.admin.User

class GameSummaryController {
    //static scaffold = GameSummaryController

    GameService gameService

    def show() {
    // ...
    }

    def update() {
        def gameId = params.id
        def description = params.description
        if (gameId && description?.length() > 0) {
            gameService.updateGame(gameId, description)
        }
        redirect(url: '/')
    }
}

调用gameService.updateGame()时,将生成此堆栈跟踪:

2019-07-15 09:47:53.892 ERROR --- [nio-8080-exec-7] org.hibernate.internal.SessionImpl       : HHH000346: Error during managed flush [null]
2019-07-15 09:47:53.977 ERROR --- [nio-8080-exec-7] o.g.web.errors.GrailsExceptionResolver   : NullPointerException occurred when processing request: [POST] /gameSummary/update/143 - parameters:
description: Try again.
update: Update
Stacktrace follows:

java.lang.reflect.InvocationTargetException: null
    at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
    at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
    at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
    at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.filter.GrailsHttpPutFormContentFilter.doFilterInternal(GrailsHttpPutFormContentFilter.groovy:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:54)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:64)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
    at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
    at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: null
    at org.hibernate.type.LongType.next(LongType.java:62)
    at org.hibernate.type.LongType.next(LongType.java:23)
    at org.hibernate.engine.internal.Versioning.increment(Versioning.java:92)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:379)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:275)
    at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:143)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:216)
    at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:85)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:38)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1295)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:468)
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3135)
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2352)
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:491)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231)
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:582)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150)
    at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
    at org.olr.nonadmin.GameSummaryController.update(GameSummaryController.groovy:40)
    ... 39 common frames omitted

基于研究,我已经尝试了这个application.yml设置(一种无法解决的问题):

hibernate:
    jdbc:
        batch_version_data: false

1 个答案:

答案 0 :(得分:0)

此更新需要包含在事务中:

def update() {
    def gameId = params.id
    def description = params.description
    if (gameId && description?.length() > 0) {
        org.olr.nonadmin.Game.withTransaction {
            gameService.updateGame(gameId, description)
        }
    }
    redirect(url: '/')
}