2012-05-10 12 views
5

Tôi đang tìm các phương pháp hay nhất liên quan đến các mô hình và cách để tồn tại các đối tượng trong cơ sở dữ liệu với phiên bản 2.0. Tôi đã nghiên cứu các mẫu Play và typesafe để chơi 2.0 bằng scala.Chơi các mô hình thực hành tốt nhất 2.0 mô hình

Những gì tôi hiểu là:

  • mô hình

    được định nghĩa trong một lớp trường hợp
  • Tất cả các chèn/cập nhật/xóa/chọn được định nghĩa trong đối tượng đồng hành của lớp trường hợp này

Vì vậy, nếu tôi cần cập nhật đối tượng Ô tô của mình để xác định chủ sở hữu mới, tôi sẽ phải làm:

val updatedCar = myCar.copy(owner=newOwner) 
Car.update(updatedCar) 
// or 
Car.updateOwner(myCar.id.get, newOwner) 

Tôi tự hỏi tại sao các bản cập nhật hoặc xóa báo cáo không phải là trong lớp trường hợp riêng của mình:

case class Car(id: Pk[Long] = NotAssigned, owner: String) { 
    def updateOwner(newOwner: String) { 
     DB.withConnection { implicit connection => 
      SQL(
       """ 
       update car 
       set owner = {newOwner} 
       where id = {id} 
       """ 
      ).on(
       'id -> id, 
       'newOwner -> newOwner 
      ).executeUpdate() 
     } 
     copy(owner = newOwner) 
    } 
} 

Làm như vậy sẽ cho phép để làm:

val updatedCar = myCar.updateOwner(newOwner) 

Đó là những gì tôi đã từng làm với Play 1. X sử dụng Java và JPA. Có lẽ lý do là hiển nhiên và do kiến ​​thức nhỏ của tôi về Scala.

Trả lời

4

Tôi nghĩ một phần lý do là ưu tiên không thay đổi trong các ngôn ngữ chức năng như Scala.

Trong ví dụ của bạn, bạn sửa đổi 'this.owner'. Hoạt động tương đương của bạn trông như thế nào để xóa và điều gì sẽ xảy ra với "điều này"?

Với đối tượng đồng hành, có vẻ rõ ràng hơn rằng đối tượng được chuyển (hoặc ID) không được sửa đổi và đối tượng hoặc ID trả lại là kết quả có liên quan của thao tác.

Sau đó, tôi cũng nghĩ rằng một phần khác của vấn đề là ví dụ của bạn yêu cầu một cá thể trước tiên. Khi bạn xóa một đối tượng, điều gì sẽ xảy ra nếu bạn chỉ muốn xóa bởi Id bạn đã tắt một biểu mẫu, và không muốn tạo một thể hiện toàn bộ đối tượng mà bạn định xóa?

Tôi đã chơi với play2.0 với Mongo, và bạn đồng hành của tôi đối tượng trông giống như:

đối tượng MyObject kéo dài SalatDAO [MyObject, ObjectId] (bộ sưu tập = getCollection ("objectcollection")) {}

Các đối tượng đồng hành này kế thừa CRUD như các hoạt động từ SalatDAO (MyObject.save(), MyObject.find(), v.v.). Tôi không hoàn toàn rõ ràng về cách nó được thực hiện trong nội bộ, nhưng nó hoạt động độc đáo.