【问题标题】:Hibernate Envers in GrailsGrails 中的休眠环境
【发布时间】:2016-03-31 02:14:57
【问题描述】:

我想在我的 Grails (v3.0.11) 应用程序中使用 Hibernate Envers。由于 grails envers 插件已经死了,我试着自己做。

我做了什么:

在 build.gradle 中,我添加了 Hibernate Envers 依赖项 compile "org.hibernate:hibernate-envers"

我的域名如下:

import org.hibernate.envers.Audited

@Audited
class Hotel {
    String name
}

在脚手架的Controller中,我只改了:

class HotelController {

    ...

    @Transactional
    def save(Hotel hotel) {
        ...
        Hotel.withTransaction {
            hotel.save flush:true    
        }
        ...
    }

    ...

}

保存时出现以下异常:

URI
    /hotel/save
Class
    org.hibernate.envers.exception.AuditException
Message
    null
Caused by
    Unable to create revision because of non-active transaction

    Line | Method
->> 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    617 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

Caused by HibernateSystemException: Unable to create revision because of non-active transaction; nested exception is org.hibernate.envers.exception.AuditException: Unable to create revision because of non-active transaction
->>   32 | doCall    in HotelController.groovy
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute . in grails.transaction.GrailsTransactionTemplate
|     31 | $tt__save in HotelController.groovy
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute   in grails.transaction.GrailsTransactionTemplate
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute   in grails.transaction.GrailsTransactionTemplate
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

Caused by AuditException: Unable to create revision because of non-active transaction
->>   32 | doCall    in HotelController.groovy
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute . in grails.transaction.GrailsTransactionTemplate
|     31 | $tt__save in HotelController.groovy
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute   in grails.transaction.GrailsTransactionTemplate
|     96 | doInTransaction in grails.transaction.GrailsTransactionTemplate$2
|     93 | execute   in grails.transaction.GrailsTransactionTemplate
|   1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
|    617 | run       in java.util.concurrent.ThreadPoolExecutor$Worker
^    745 | run . . . in java.lang.Thread

我做错了什么?如何使交易“活跃”?

【问题讨论】:

  • 看起来您实际上在那里使用了两个事务。尝试删除 withTransaction 闭包或 @Transactional 注释。看看范围内只有一个事务会发生什么。
  • 我都试过了,没有任何改变。我只是尝试使用 withTransaction 方法,因为我在旧的 envers 插件 (lucasward.net/2011/04/grails-envers-plugin.html) 中看到过它

标签: hibernate grails hibernate-envers


【解决方案1】:

尝试排除 envers 的传递依赖。为我工作。我想拉入hibernate-entitymanager 在这里没有任何好处。所以:

compile("org.hibernate:hibernate-envers") { transitive = false }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多