SLICK How to define bidirectional one-to-many relationship for use in case class

前端 未结 1 1886
不知归路
不知归路 2020-12-13 11:09

I am using SLICK 1.0.0-RC2. I have defined the following two tables Directorate and ServiceArea where Directorate has a one to many relationship with ServiceArea



        
相关标签:
1条回答
  • 2020-12-13 11:29

    I'm sure there is a more elegant solution, but this should do the trick:

    import scala.slick.driver.H2Driver.simple._
    import Database.threadLocalSession
    
    object SlickExperiments2 {
    
      Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession {
    
        (Directorates.ddl ++ ServiceAreas.ddl).create
    
        case class Directorate(dirCode: String, name: String) {
          def serviceAreas: Seq[ServiceArea] = (for {
            a <- ServiceAreas
            if (a.dirCode === dirCode)
          } yield (a)).list
        }
    
        object Directorates extends Table[Directorate]("DIRECTORATES") {
    
          def dirCode = column[String]("DIRECTORATE_CODE", O.PrimaryKey)
    
          def name = column[String]("NAME")
    
          def * = dirCode ~ name <> (Directorate, Directorate.unapply _)
        }
    
        case class ServiceArea(areaCode: String, dirCode: String, name: String)
    
        object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") {
    
          def areaCode = column[String]("AREAE_CODE", O.PrimaryKey)
    
          def dirCode = column[String]("DIRECTORATE_CODE")
    
          def name = column[String]("NAME")
    
          def directorate = foreignKey("DIR_FK", dirCode, Directorates)(_.dirCode)
    
          def * = areaCode ~ dirCode ~ name <> (ServiceArea, ServiceArea.unapply _)
        }
    
        Directorates.insert(Directorate("Dircode", "Dirname"))
    
        ServiceAreas.insertAll(ServiceArea("a", "Dircode", "A"), ServiceArea("b", "Dircode", "B"))
    
        val sa = (for{
        d <- Directorates
        } yield d).list map { case t: Directorate => t.serviceAreas}
    
        println(sa)
      }                                              
     //> List(List(ServiceArea(a,Dircode,A), ServiceArea(b,Dircode,B)))
    }
    
    0 讨论(0)
提交回复
热议问题