2011-12-05 40 views
5

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) 
    }) 
} 

Trả lời

3

Trước hết, tôi xin lỗi vì thiếu tài liệu. Cấu trúc using() là một tính năng mới chỉ có trong các bản dựng SNAPSHOT. Tôi thực sự đã nói chuyện với Max về một số vấn đề về tài liệu cho những người dùng đầu tiên ngày hôm qua và chúng tôi đang cố gắng khắc phục chúng.

Không có cách nào mà tôi có thể nghĩ đến để ràng buộc một Phiên cụ thể với Truy vấn. Nhìn vào ví dụ của bạn, có vẻ như một công việc dễ dàng xung quanh sẽ là đảo ngược các giao dịch của bạn. Khi bạn tạo một truy vấn, Squeryl không thực sự truy cập DB, nó chỉ tạo ra một AST biểu diễn SQL được thực hiện, do đó bạn không cần phải sử dụng (sessionA) của bạn tại thời điểm đó. Sau đó, khi bạn đã sẵn sàng để lặp qua các kết quả, bạn có thể bọc lời gọi truy vấn trong một sử dụng (sessionA) lồng nhau trong sử dụng của bạn (sessionB). Điều đó có ý nghĩa?

+0

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

Các vấn đề liên quan