如何用羽毛笔插入一对多对象?

时间:2018-01-25 22:43:39

标签: mysql scala quill

我有一个简单的Parent对象:

case class ParentCreate(name: String, age: Int, kids: Seq[String])

现在,在数据库中我有2个表来代表这个,perent&孩子,因为父母可以有很多孩子,而在孩子表中,我有一个父母的外键。

表的创建如下所示:

CREATE TABLE Parent (
    parentId int NOT NULL AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    age int NOT NULL,
    PRIMARY KEY (parentId)
);

CREATE TABLE Kid (
    kidId int NOT NULL AUTO_INCREMENT,
    name: varchar(255) NOT NULL,
    parentId int NOT NULL,
    PRIMARY KEY (kidId),
    FOREIGN KEY (parentId) REFERENCES Parent(parentId)
);

所以现在当我收到ParentCreate对象的请求时,我需要另外一层表示数据库结构的case类,所以我需要将ParentCreate对象转换为{{1} }和Parent个对象:

Kid

因为这是在数据库中建模数据的方式。

我的问题是我收到了一个仍然没有parentId的Parent(name: String, age: Int) Kid(name: String) 请求,并且插入了我需要孩子的孩子parentId ......

如何以羽毛笔的最佳方式完成这项工作?

感谢任何帮助:)

1 个答案:

答案 0 :(得分:2)

这是我在项目中的方式:

case class KidId(value: Long) extends AnyVal
case class ParentId(value: Long) extends AnyVal

case class ParentRecord(id: ParentId
                  , name: String
                  , age: Int
                 )

case class Parent(id: ParentId
                  , name: String
                  , age: Int
                 )

object Parent {
  def createNew(name: String, age: Int, id: ParentId = ParentId(0L)): Parent = {
    Parent(id
      , name
      , age
    )
  }
}


case class KidRecord(
                      id: KidId
                      , parentId: ParentId
                      , name: String
                    )

case class Kid(
                id: KidId
                , parent: Parent
                , name: String
               )

object Kid {
  def createNew(name: String, parent: Parent): Kid = {
    Kid(KidId(0L)
      , parent
      , name
    )
  }
}

然后这是将放入不同包中的羽毛笔代码

def createParent(parent: Parent): ParentId = {
  ctx.run(quote {
      query[ParentRecord].insert (
        _.name -> lift (parent.name)
        , _.age -> lift (parent.age)
      ).returning (_.id)
    }
  )
}

def createKid(kid: Kid): KidId = {
  ctx.run(quote {
      query[KidRecord].insert(
        _.name -> lift(kid.name)
        , _.parentId -> lift(kid.parent.id)
      ).returning(_.id)
    }
  )
}

然后由此控制器代码

使用
def createParentController(name: String, age: Integer, kids: Seq[String]) = {
  val parentToCreate = Parent.createNew(name, age)
  val parentId = createParent(parentToCreate)
  val createdParent = Parent.createNew(name, age, parentId)
  for (kid <- kids) {
    createKidController(kid, parentToCreate)
  }
}

def createKidController(name: String, parent: Parent) = {
  val kidToCreate = Kid.createNew(name, parent)
  val kidId = createKid(kidToCreate)
}

首要的是你需要先创建父项,然后将父项传递给你用来创建孩子的任何方法。警告:我还是Scala和Quill的新手。