How do I model a relational database link-table with Scala?

后端 未结 1 1668
野的像风
野的像风 2021-02-06 18:52

I need to do quite a few many to many mapping of objects in Scala and save it to a relational database.

Here is a fake example to simplify the problem:

Let\'s sa

相关标签:
1条回答
  • 2021-02-06 19:06

    I personally prefer Lift's Mapper library for this, and have occasionally used it outside of the context of a Lift web application. The following is a complete working example, which you can run from sbt for example with the following as your build.sbt:

    libraryDependencies ++= Seq(
      "net.liftweb" %% "lift-mapper" % "2.4" % "compile->default",
      "com.h2database" % "h2" % "1.2.127"
    )
    

    First for the models:

    import net.liftweb.common._, net.liftweb.mapper._
    
    object Student extends Student with LongKeyedMetaMapper[Student]
    class Student extends LongKeyedMapper[Student] with IdPK with ManyToMany {
      def getSingleton = Student
      object name extends MappedString(this, 40)
      object rooms extends MappedManyToMany(
        StudentRoom, StudentRoom.student, StudentRoom.room, Room
      )
    }
    
    object Room extends Room with LongKeyedMetaMapper[Room]
    class Room extends LongKeyedMapper[Room] with IdPK with ManyToMany {
      def getSingleton = Room
      object subject extends MappedString(this, 40)
      object students extends MappedManyToMany(
        StudentRoom, StudentRoom.room, StudentRoom.student, Student
      )
    }
    
    object StudentRoom extends StudentRoom with LongKeyedMetaMapper[StudentRoom] {
      override def dbIndexes = Index(student, room) :: super.dbIndexes
    }
    
    class StudentRoom extends LongKeyedMapper[StudentRoom] with IdPK {
      def getSingleton = StudentRoom
      object student extends MappedLongForeignKey(this, Student)
      object room extends MappedLongForeignKey(this, Room)
    }
    

    And some database setup:

    DB.defineConnectionManager(
      DefaultConnectionIdentifier,
      new StandardDBVendor("org.h2.Driver", "jdbc:h2:mem:example", Empty, Empty)
    )
    
    Schemifier.schemify(true, Schemifier.infoF _, Student, Room, StudentRoom)
    

    And some data:

    val m = Student.create.name("Mary"); m.save
    val j = Student.create.name("John"); j.save
    val physics = Room.create.subject("Physics"); physics.save
    StudentRoom.create.student(m).room(physics).save
    StudentRoom.create.student(j).room(physics).save
    

    And we're ready:

    scala> Room.findAll(By(Room.subject, "Physics")).flatMap(_.students)
    res7: List[Student] = List(Student={name=Mary,id=2}, Student={name=John,id=3})
    
    0 讨论(0)
提交回复
热议问题