使用 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 【问题描述】:

我正在尝试映射 musicsalbums 之间的关系 - 音乐属于专辑,而一张专辑可能有很多音乐。

根据Slick's docs,这应该相当简单......但是,我没有像文档中那样将表放在单个文件中,这就是我的问题出现的地方:我不知道如何访问当我需要映射外键时,MusicRepository.scala 中的专辑表 val 正确。

这是我收到的错误消息:not found: value AlbumRepository

我尝试过import dal.AlbumRepository,但没有成功... 这是否也与我的 val albumsprivate 有关 - 或者这完全是另一个问题?

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 模板文件中解析

如何搭建scala的play框架

使用ScalaTest和Selenium测试Scala.JS + Play

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用

如何在视图页面中使用Play框架和Scala显示图像