2

如果可以像这样在学习 slick2之后定义嵌套类(嵌入在 JPA 中):

case class Person(name: Name, address: Address)
case class Name(given: String, family: String)
case class Address(street: String, city: String)

class Directory(tag: Tag) extends Table[Person](tag, "directory") {
  def givenName   = column["String"] ( "given_name" )
  def familyName  = column["String"] ( "family_name" )
  def street      = column["String"] ( "street" )
  def city        = column["String"] ( "city" )

  def * = (name, address) <> (Person.tupled, Person.unapply)
  def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
  def address = (street, city) <> (Address.tupled, Address.unapply)
}

我不想在嵌入 Adress 的每个表中都写下街道、城市和地址的定义。我想写一些类似下面的东西,但是由于明显的原因这不能编译,因为 column 是 Table 等上的一种方法......是否可以以某种方式重用列定义?

object Adresses {
    def street      = column["String"] ( "street" )
    def city        = column["String"] ( "city" )
    def address = (street, city) <> (Address.tupled, Address.unapply)
}

class Directory(tag: Tag) extends Table[Person](tag, "directory") {
      def givenName   = column["String"] ( "given_name" )
      def familyName  = column["String"] ( "family_name" )


      def * = (name, Adresses.address) <> (Person.tupled, Person.unapply)  //address from Adresses
      def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
}
4

1 回答 1

3

您可以使 Adresses 成为从类 Table 继承的特征(是的,有效)。

trait Adresses[T] extends Table[T]{
    def street      = column["String"] ( "street" )
    def city        = column["String"] ( "city" )
    def address = (street, city) <> (Address.tupled, Address.unapply)
}

class Directory(tag: Tag) extends Table[Person](tag, "directory") with Adresses[Person] {
      def givenName   = column["String"] ( "given_name" )
      def familyName  = column["String"] ( "family_name" )


      def * = (name, address) <> (Person.tupled, Person.unapply)  //address from Adresses
      def name = (givenName, familyName) <> (Name.tupled, Name.unapply)
}
于 2014-05-20T20:16:09.113 回答