在PlaySlick DAO中导出Slick表

时间:2016-12-05 13:26:27

标签: slick slick-3.0

以下代码是演示DAO类的PlaySlick示例。我使用它作为示例,但我的问题是我在多个DAO中使用相同的表(例如,CatTable类),并且因为该表是内部类,所以我无法将其导入其他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 个答案:

答案 0 :(得分: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,那么你就失去了可组合性(你将无法在同一个事务中执行多个操作)。