我有一个简单的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 ......
如何以羽毛笔的最佳方式完成这项工作?
感谢任何帮助:)
答案 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的新手。