Java Micronaut MySQL删除记录org.hibernate.hibernateeException:未找到当前线程的会话
使用Micronaut Groovy GROM,我能够从MySQL数据库读取数据。但是当我试图删除记录时,它抛出了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
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
注释。