Java Micronaut MySQL删除记录org.hibernate.hibernateeException:未找到当前线程的会话

Java Micronaut MySQL删除记录org.hibernate.hibernateeException:未找到当前线程的会话,java,hibernate,micronaut,Java,Hibernate,Micronaut,使用Micronaut Groovy GROM,我能够从MySQL数据库读取数据。但是当我试图删除记录时,它抛出了org.hibernate.HibernateException:找不到当前线程的会话错误消息 curl -s http://localhost:8880/book/1 {"bookid":"1","name":"Java","id":1} curl -s http://localhost:8880/book/delete/1 {"message":"Internal Server

使用Micronaut Groovy GROM,我能够从MySQL数据库读取数据。但是当我试图删除记录时,它抛出了
org.hibernate.HibernateException:找不到当前线程的会话
错误消息

curl -s http://localhost:8880/book/1
{"bookid":"1","name":"Java","id":1}

curl -s http://localhost:8880/book/delete/1
{"message":"Internal Server Error: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread"}
这是我的控制器代码:

    package webapp

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Body
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.Post
import io.micronaut.http.annotation.Delete
import io.micronaut.http.HttpStatus
import io.micronaut.http.HttpResponse
import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import io.micronaut.spring.tx.annotation.Transactional;

@Slf4j
//@CompileStatic
@Controller("/book")
class BookController implements BooksApi {

    final BookService bookService

    BookController(BookService bookService) {
        this.bookService = bookService
    }

    @Get("/list")
    List<Book> listBooks() {
        return bookService.findAll()
    }


    @Get("/count")
    int Count(){
        return bookService.count()
    }

    @Override
    @Get("/{id}")
    Book show(Long id) {
        return bookService.find(id)
    }

    @Delete("/{id}")
    Book delete(Long id) {
        Book b= bookService.find(id)
        if(b){
       // b.delete(flush: true)
        b.delete()
        }
        return b
    }


   @Post("/save")
   def save(@Body Object JSON) {
    String bookid=JSON?.bookid
    String name=JSON?.name


    def b =bookService.save(bookid,name)
    return HttpResponse.created(b)

   }

   @Get("/")
    String index() {
        return "Hello World"
    }

}
打包webapp
导入io.micronaut.http.annotation.Controller
导入io.micronaut.http.annotation.Body
导入io.micronaut.http.annotation.Get
导入io.micronaut.http.annotation.Post
导入io.micronaut.http.annotation.Delete
导入io.micronaut.http.HttpStatus
导入io.micronaut.http.HttpResponse
导入groovy.transform.CompileStatic
导入groovy.util.logging.Slf4j
导入io.micronaut.spring.tx.annotation.Transactional;
@Slf4j
//@编译的
@控制器(“/book”)
类BookController实现BooksApi{
最终图书服务
BookController(BookService BookService){
this.bookService=bookService
}
@获取(“/list”)
列表簿(){
returnbookservice.findAll()
}
@获取(“/count”)
整数计数(){
return bookService.count()
}
@凌驾
@获取(“/{id}”)
书展(长id){
return bookService.find(id)
}
@删除(“/{id}”)
图书删除(长id){
Book b=bookService.find(id)
如果(b){
//b.删除(刷新:真)
b、 删除()
}
返回b
}
@Post(“/保存”)
def save(@Body Object JSON){
字符串bookid=JSON?.bookid
String name=JSON?.name
def b=bookService.save(bookid,name)
返回HttpResponse.created(b)
}
@获取(“/”)
字符串索引(){
返回“你好,世界”
}
}
我能知道我做错了什么吗

谢谢

更新代码1 图书服务

package webapp

import grails.gorm.services.Service

import javax.validation.constraints.NotBlank
import javax.validation.constraints.NotNull
import grails.gorm.transactions.Transactional;


@Service(Book)
interface BookService {

    int count()
    Book save(@NotBlank String bookid,@NotBlank String name)
    List<Book> findAll()
    Book find(@NotNull Long id)

    @Transactional
    Book delete(@NotNull Long id)

    void deleteById(Long id)
}
打包webapp
导入grails.gorm.services.Service
导入javax.validation.constraints.NotBlank
导入javax.validation.constraints.NotNull
导入grails.gorm.transactions.Transactional;
@服务(书籍)
接口图书服务{
整数计数()
书本保存(@NotBlank String bookid,@NotBlank String name)
列表findAll()
书籍查找(@NotNull Long id)
@交易的
图书删除(@NotNull Long id)
void deleteById(长id)
}

在杰夫·布朗的帮助下,我成功了。这是工作代码

服务:

package webapp

import grails.gorm.services.Service

import javax.validation.constraints.NotBlank
import javax.validation.constraints.NotNull

@Service(Book)
interface BookService {
    int count()

    Book save(@NotBlank String bookid, @NotBlank String name)

    List<Book> findAll()

    Book find(@NotNull Long id)

    Book delete(@NotNull Long id)    
} 
application.yaml文件

---
micronaut:
    application:
        name: webapp
    server:
        port: 8880

---
datasources.default: {}
---
hibernate:
  hbm2ddl:
    auto: update
  cache:
    queries: false
    use_second_level_cache: true
    use_query_cache: false
    region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
dataSource:
  url: jdbc:mysql://localhost:3306/db
  dbCreate: create-update
  pooled: true
  jmxExport: true
  driverClassName: com.mysql.jdbc.Driver
  dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  username:  
  password:  
希望这能帮助别人


谢谢

在杰夫·布朗的帮助下,我成功了。这是工作代码

服务:

package webapp

import grails.gorm.services.Service

import javax.validation.constraints.NotBlank
import javax.validation.constraints.NotNull

@Service(Book)
interface BookService {
    int count()

    Book save(@NotBlank String bookid, @NotBlank String name)

    List<Book> findAll()

    Book find(@NotNull Long id)

    Book delete(@NotNull Long id)    
} 
application.yaml文件

---
micronaut:
    application:
        name: webapp
    server:
        port: 8880

---
datasources.default: {}
---
hibernate:
  hbm2ddl:
    auto: update
  cache:
    queries: false
    use_second_level_cache: true
    use_query_cache: false
    region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
dataSource:
  url: jdbc:mysql://localhost:3306/db
  dbCreate: create-update
  pooled: true
  jmxExport: true
  driverClassName: com.mysql.jdbc.Driver
  dialect: org.hibernate.dialect.MySQL5InnoDBDialect
  username:  
  password:  
希望这能帮助别人


谢谢

图书服务
grails.gorm.services.Service
注释的吗?顺便说一句。。。为响应
GET
请求而删除数据通常不是一个好主意。将
@Transactional
移动到服务类将无济于事。默认情况下,GORM数据服务是事务性的,如果将其从控制器操作中删除,则删除将发生在事务之外。更好的办法是将删除移到服务中。为什么要调用
b.delete()
而不是
bookService.delete(id)
?如果将事务性内容移到GORM数据服务中,您不需要使用任何
@Transactional
注释。是否用
grails.gorm.services.Service
注释了
BookService
。。。为响应
GET
请求而删除数据通常不是一个好主意。将
@Transactional
移动到服务类将无济于事。默认情况下,GORM数据服务是事务性的,如果将其从控制器操作中删除,则删除将发生在事务之外。更好的办法是将删除移到服务中。为什么要调用
b.delete()
而不是
bookService.delete(id)
?如果将事务性内容移到GORM数据服务中,则不需要使用任何
@transactional
注释。