2015-12-24 77 views
1

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

我做了什么:

中的build.gradle

,我加入了休眠Envers依赖 compile "org.hibernate:hibernate-envers"

我的域名看起来像:

import org.hibernate.envers.Audited 

@Audited 
class Hotel { 
    String name 
} 
在脚手架控制器

,我只是改变了:

class HotelController { 

    ... 

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

    ... 

} 

我ge t保存时有以下例外情况:

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 

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

+0

看起来像使用两个交易实际上有。尝试删除'withTransaction'闭包或'@ Transactional'注释。查看范围内仅发生一次事务会发生什么。 –

+0

我尝试了两个,没有改变。我只是试图使用withTransaction方法,因为我在旧的envers插件中看到它(http://www.lucasward.net/2011/04/grails-envers-plugin.html) – mmz

回答

0

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

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