以下代码是演示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 _)
}
}
答案 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
,那么你就失去了可组合性(你将无法在同一个事务中执行多个操作)。