2016-12-05 15 views
0

下面的代碼是演示DAO類的PlaySlick示例。我用它作爲示例,但是我的問題是我在多個DAO中使用同一個表(例如,CatTable類),並且由於該表是內部類,因此我無法將其導入其他DAO中,因爲它不是在伴侶對象中。有沒有辦法來解決這個問題?在PlaySlick中導出滑動表DAO

package dao 

import scala.concurrent.Future 

import javax.inject.Inject 
import models.Cat 
import play.api.db.slick.DatabaseConfigProvider 
import play.api.db.slick.HasDatabaseConfigProvider 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import slick.driver.JdbcProfile 

class CatDAO @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) 
        extends HasDatabaseConfigProvider[JdbcProfile] { 
    import driver.api._ 

    private val Cats = TableQuery[CatsTable] 

    def all(): Future[Seq[Cat]] = db.run(Cats.result) 

    def insert(cat: Cat): Future[Unit] = db.run(Cats += cat).map { _ =>() } 

    private class CatsTable(tag: Tag) extends Table[Cat](tag, "CAT") { 

    def name = column[String]("NAME", O.PrimaryKey) 
    def color = column[String]("COLOR") 

    def * = (name, color) <> (Cat.tupled, Cat.unapply _) 
    } 
} 

回答

1

當然可以。我們經常使用經典的做法是這樣的:

// student course segment 
    case class StudentCourseSegment(studentId: Id[Student], 
            courseId: Id[Course], 
            semesterId: Id[Semester], 
            id: Id[StudentCourseSegment] = Id.none) 

    class StudentCourseSegmentTable(tag: Tag) extends 
    Table[StudentCourseSegment](tag, "STUDENT_COURSE_SEGMENT") { 
    def studentId = column[Id[Student]]("STUDENT_ID") 
    def courseId = column[Id[Course]]("COURSE_ID") 
    def semesterId = column[Id[Semester]]("SEMESTER_ID") 
    def id = column[Id[StudentCourseSegment]]("ID", O.PrimaryKey, O.AutoInc) 

    def * = (studentId, courseId, semesterId, id) <> (StudentCourseSegment.tupled, 
                 StudentCourseSegment.unapply) 

    // foreign keys 
    def student = foreignKey("fk_segment_student", studentId, StudentTable)(_.id) 
    def course = foreignKey("fk_segment_course", courseId, CourseTable)(_.id) 
    def semester = foreignKey("fk_segment_semester", semesterId, SemesterTable)(_.id) 
    } 

    lazy val StudentCourseSegmentTable = TableQuery[StudentCourseSegmentTable] 

(例如,從我的介紹:http://slides.com/pdolega/slick-101#/69

所以,你必須(在同一水平上):

  • 案例類 - 又名解壓類型(您的域名在申請中)
  • 表格定義 - 又名混合類型
  • 表查詢對象

您對此表的主要DAO將使用此定義,但其他DAO(例如,爲做joins)。

這裏我想是這樣的:沒有任何東西強迫你保留TableQuery(或其他提及的工件)作爲私人內部成員/類。您可以將它們保留爲內部類,作爲頂級類位於同一文件中或完全位於其他位置。

另外一件事 - 與問題無關,但我在你的例子中看到它。我建議留在DBIO級別,就像在你的DAO課程中一樣;如果您立即將所有內容轉換爲Future,則會降低可組合性(您將無法在同一事務中執行多個操作)。

+0

謝謝,但我仍然有問題。我有兩種選擇:在DAO之外聲明表定義(在這種情況下,我不知道如何導入api)或以某種方式訪問​​內部類。我更喜歡第一種方法,但如何導入api?如果你看一下,導入是INSIDE類,這就是我無法獨立定義表定義的原因。順便說一下,這段代碼取自PlaySlick的例子,如果最好使用DBIO,那麼他們應該更新它。 – ps0604

+0

[Here](https://github.com/playframework/play-slick/blob/master/samples/computer-database/app/dao/CompaniesDAO.scala)我有另一個在PlaySlick中聲明表格定義的例子。由於它屬於特質,因此我不能在不同的DAO中使用它,因爲特質是隱藏的。 – ps0604

+0

好吧......這很簡單:只需導入你需要的東西,就像這裏:https://gist.github.com/pdolega/359797842c4f15cfb35b10a2be8d2e39(見第9行導入:'import slick.jdbc.H2Profile.api._'? )。 我再說一遍 - 沒有人強迫你將表定義放入內部類或特質或其他內容中。這真是人爲的問題 - 把它放在適合你的地方。至於例子 - 他們保持這種方式,因爲它是最簡單的事情(把所有的東西放在一個班級/特質中完成)。 –