Tôi đang học Squeryl và cố gắng hiểu cú pháp 'sử dụng' nhưng không thể tìm thấy tài liệu về nó.Quản lý phiên Squeryl với 'sử dụng'
Trong ví dụ sau hai cơ sở dữ liệu được tạo ra, A chứa từ Xin chào, và B chứa Tạm biệt. Mục đích là để truy vấn các nội dung của A, sau đó nối từ Thế giới và viết kết quả đến B.
đầu ra giao diện điều khiển dự kiến là chèn tin nhắn (2, HelloWorld)
object Test {
def main(args: Array[String]) {
Class.forName("org.h2.Driver");
import Library._
val sessionA = Session.create(DriverManager.getConnection(
"jdbc:h2:file:data/dbA","sa","password"),new H2Adapter)
val sessionB = Session.create(DriverManager.getConnection(
"jdbc:h2:file:data/dbB","sa","password"),new H2Adapter)
using(sessionA){
drop; create
myTable.insert(Message(0,"Hello"))
}
using(sessionB){
drop; create
myTable.insert(Message(0,"Goodbye"))
}
using(sessionA){
val results = from(myTable)(s => select(s))//.toList
using(sessionB){
results.foreach(m => {
val newMsg = m.copy(msg = (m.msg+"World"))
myTable.insert(newMsg)
println("Inserted "+newMsg)
})
}
}
}
case class Message(val id: Long, val msg: String) extends KeyedEntity[Long]
object Library extends Schema { val myTable = table[Message] }
}
Vì nó viết tắt, mã in Tin nhắn được chèn (2, GoodbyeWorld), trừ khi toList được thêm vào cuối dòng val results.
Có một số cách để ràng buộc kết quả truy vấn để sử dụng sessionA ngay cả khi đánh giá bên trong sử dụng (sessionB)? Điều này có vẻ thích hợp hơn khi sử dụng toList để buộc truy vấn đánh giá và lưu trữ nội dung trong bộ nhớ.
Cập nhật
Nhờ câu trả lời Dave Whittaker của, đoạn sau sửa chữa nó mà không cần đến 'ToList' và sửa chữa sự hiểu biết của tôi về cả 'sử dụng' và các hoạt động của câu truy vấn.
val results = from(myTable)(s => select(s))
using(sessionA){
results.foreach(m => {
val newMsg = m.copy(msg = (m.msg+"World"))
using(sessionB){myTable.insert(newMsg)}
println("Inserted "+newMsg)
})
}
Dave, cảm ơn tất cả những nỗ lực của bạn về Squeryl, đã thay đổi cách tôi coi ORM và củng cố cam kết của tôi với Scala. Tôi ngạc nhiên khi sử dụng() chỉ nên có trong ảnh chụp nhanh, vì tôi chắc chắn rằng tôi vừa kéo bình ra khỏi trang web. Đã cập nhật câu hỏi của tôi với giải pháp của bạn mà thực sự làm rõ mọi thứ. – Pengin