2015-12-24 76 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 }