使用 Play with Scala 和 Slick 在不同文件上的表之间建立一对多关系
Posted
技术标签:
【中文标题】使用 Play with Scala 和 Slick 在不同文件上的表之间建立一对多关系【英文标题】:One-to-many relationship between tables on different files using Play with Scala and Slick 【发布时间】:2015-10-07 18:51:23 【问题描述】:我正在尝试映射 musics 和 albums 之间的关系 - 音乐属于专辑,而一张专辑可能有很多音乐。
根据Slick's docs,这应该相当简单......但是,我没有像文档中那样将表放在单个文件中,这就是我的问题出现的地方:我不知道如何访问当我需要映射外键时,MusicRepository.scala 中的专辑表 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)
提前谢谢你!
【问题讨论】:
【参考方案1】:我认为您需要导入 dal.AlbumRepository.Albums,是的,您可能需要将其公开。 否则,您也可以跳过 slick 中的整个外键内容。没有它工作得很好。
【讨论】:
不幸的是,它没有用,但我得到了关于这个问题的更多信息!导入时出现以下错误:object AlbumRepository is not a member of package dal 注意:类 AlbumRepository 存在,但没有伴随对象。 还有一个问题:如果我跳过整个外键内容,它仍然有效吗?你说这没用?我认为这个映射是负责之后进行以下工作的东西:music.album.name
- 这将包含音乐专辑的名称
music.album.name 仍然不可能:groups.google.com/forum/#!msg/scalaquery/esFb2DjoHVE/…AFAIK 它只是用于代码生成器,所以我根本不使用它。以上是关于使用 Play with Scala 和 Slick 在不同文件上的表之间建立一对多关系的主要内容,如果未能解决你的问题,请参考以下文章
scala play 应用程序的 Heroku procfile
TwirlKeys.templateImports with Play 未在 IntelliJ IDEA 模板文件中解析
使用ScalaTest和Selenium测试Scala.JS + Play