Tôi có bao giờ cần xóa rõ ràng các lệnh gọi lưu GORM trong grails không?

Tôi gặp một trường hợp lạ dường như cho biết sự cố bộ nhớ đệm GORM

//begin with all book.status's as UNREAD
Book.list().each { book.status = Status.READ ; book.save() }

println (Book.findAllByStatus (Status.READ)) //will print an empty list
println (Book.list().findAll (it.status == Status.READ)) // will print all books   

Tôi không thể hiểu tại sao hai truy vấn cuối cùng có thể trả về kết quả khác nhau.

Tuy nhiên, nếu Tôi thực hiện sửa đổi sau đây đối với book.save (flush: true) . Cả hai câu lệnh println sẽ trả về tất cả các sách.

Tôi có ấn tượng rằng điều này không cần thiết trong một ứng dụng.

Để tham khảo, tôi đang sử dụng

  • DB: mysql
  • Groovy: 1.7.10
  • Grails: 1.3.7

@ Hoàng Long

Vấn đề của tôi được minh họa bên dưới, giả sử action1 / action2 là cả hai đều được gọi nhiều lần, không theo mẫu cụ thể nào

def action1 = {
   Foo foo = Foo.get(params.id)
   //... modify foo 
   foo.save() //if I flush here, it will be inefficient if action1 is called in sequence
}

def action2 = {
   //if I flush here, it will be inefficient if action2 is called in sequence
   List<Foo> foos = Foo.findAllByBar (params.bar)
   //... do something with foos
}

Một giải pháp là có một cờ được đặt bởi action1 và được action2 sử dụng để tuôn ra nếu cần. Vấn đề của tôi là đây là một giải pháp quá phức tạp, không có thể mở rộng khi độ phức tạp của các lệnh gọi DB tăng lên.

boolean isFlushed = true

def action1 = {
   Foo foo = Foo.get(params.id)
   //... modify foo 
   foo.save() 
   isFlushed = false
}

def action2 = {
   if (!isFlushed) {
      //flush hibernate session here
   }
   List<Foo> foos = Foo.findAllByBar (params.bar)
   //... do something with foos
}
37
задан Akusete 10 June 2011 в 04:08
поделиться