使用 Play with Scala 和 Slick 实现不同文件表之间的一对多关系
One-to-many relationship between tables on different files using Play with Scala and Slick
我正在尝试映射 音乐 和 专辑 之间的关系 - 音乐属于一张专辑,而一张专辑可能有很多音乐。
根据 Slick's docs 这应该是相当简单的......但是,我没有像文档中那样将我的 table 放在一个文件中,这就是我的问题出现的地方:我不知道如何在需要映射外键时从 MusicRepository.scala 正确访问相册 table val。
这是我收到的错误消息:not found: value AlbumRepository
我试过import dal.AlbumRepository
但是没用...
这是否也与我的 val albums
是 private 有关 - 或者这是另一个问题?
AlbumRepository.scala
package dal
/* Omitted for brevity */
@Singleton
class AlbumRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)
(implicit ec: ExecutionContext) {
private val dbConfig = dbConfigProvider.get[JdbcProfile]
import dbConfig._
import driver.api._
private val albums = TableQuery[Albums]
/* Omitted for brevity */
// Albums table
private class Albums(tag: Tag) extends Table[Album](tag, "albums") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def description = column[String]("description")
def * = (id, name, description) <>((Album.apply _).tupled, Album.unapply)
}
}
MusicRepository.scala
package dal
import javax.inject.Inject
import models.Music
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile
import scala.concurrent.{Future, ExecutionContext}
class MusicRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)
(implicit ec: ExecutionContext) {
/* Omitted for brevity */
// Musics table
private class Musics(tag: Tag) extends Table[Music](tag, "musics") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def albumId = column[Long]("album_id")
def title = column[String]("title")
def lyrics = column[String]("lyrics")
def year = column[Int]("year")
def * = (id, albumId, title, lyrics, year) <>((Music.apply _).tupled, Music.unapply)
//
// THIS IS WHERE I AM GETTING THE ERROR MESSAGE
//
def album = foreignKey("album_fk", albumId, AlbumRepository.albums)(_.id)
}
}
提前致谢!
我认为您需要导入 dal.AlbumRepository.Albums,是的,您可能需要导入 public。
否则你也可以跳过 slick 中的所有外键内容。没有它也能很好地工作。
我正在尝试映射 音乐 和 专辑 之间的关系 - 音乐属于一张专辑,而一张专辑可能有很多音乐。
根据 Slick's docs 这应该是相当简单的......但是,我没有像文档中那样将我的 table 放在一个文件中,这就是我的问题出现的地方:我不知道如何在需要映射外键时从 MusicRepository.scala 正确访问相册 table val。
这是我收到的错误消息:not found: value AlbumRepository
我试过import dal.AlbumRepository
但是没用...
这是否也与我的 val albums
是 private 有关 - 或者这是另一个问题?
AlbumRepository.scala
package dal
/* Omitted for brevity */
@Singleton
class AlbumRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)
(implicit ec: ExecutionContext) {
private val dbConfig = dbConfigProvider.get[JdbcProfile]
import dbConfig._
import driver.api._
private val albums = TableQuery[Albums]
/* Omitted for brevity */
// Albums table
private class Albums(tag: Tag) extends Table[Album](tag, "albums") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def description = column[String]("description")
def * = (id, name, description) <>((Album.apply _).tupled, Album.unapply)
}
}
MusicRepository.scala
package dal
import javax.inject.Inject
import models.Music
import play.api.db.slick.DatabaseConfigProvider
import slick.driver.JdbcProfile
import scala.concurrent.{Future, ExecutionContext}
class MusicRepository @Inject()(dbConfigProvider: DatabaseConfigProvider)
(implicit ec: ExecutionContext) {
/* Omitted for brevity */
// Musics table
private class Musics(tag: Tag) extends Table[Music](tag, "musics") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def albumId = column[Long]("album_id")
def title = column[String]("title")
def lyrics = column[String]("lyrics")
def year = column[Int]("year")
def * = (id, albumId, title, lyrics, year) <>((Music.apply _).tupled, Music.unapply)
//
// THIS IS WHERE I AM GETTING THE ERROR MESSAGE
//
def album = foreignKey("album_fk", albumId, AlbumRepository.albums)(_.id)
}
}
提前致谢!
我认为您需要导入 dal.AlbumRepository.Albums,是的,您可能需要导入 public。 否则你也可以跳过 slick 中的所有外键内容。没有它也能很好地工作。