0

我正在使用幻象在游戏框架中连接 cassandra。按照教程创建了第一个类。一切正常。

case class User(id: String, page: Map[String,String])

sealed class Users extends CassandraTable[Users, User] {

  object id extends StringColumn(this) with PartitionKey[String]

  object page extends MapColumn[String,String](this)

  def fromRow(row: Row): User = {
    User(
      id(row),
      page(row)
    )
  }
}

abstract class ConcreteUsers extends Users with RootConnector {
  def getById(page: String): Future[Option[User]] = {
    select.where(_.id eqs id).one()
  }
  def create(id:String, kv:(String,String)): Future[ResultSet] = {
    insert.value(_.id, id).value(_.page, Map(kv)).consistencyLevel_=(ConsistencyLevel.QUORUM).future()
  }
}

class UserDB(val keyspace: KeySpaceDef) extends Database(keyspace) {

  object users extends ConcreteUsers with keyspace.Connector

}

object UserDB extends ResourceAuthDB(conn) {
  def createTable() {
    Await.ready(users.create.ifNotExists().future(), 3.seconds)
  }
}

但是,当我尝试按照完全相同的方式创建另一个表时,play 在编译时会抛出异常:

overriding method session in trait RootConnector of type => com.datastax.driver.core.Session;

我怎么能建立创建另一个表?也有人可以解释导致异常的原因吗?谢谢。

编辑

我将连接部分一起移动到一个类中:

class UserDB(val keyspace: KeySpaceDef) extends Database(keyspace) {
  object users extends ConcreteUsers with keyspace.Connector
  object auth extends ConcreteAuthInfo with keyspace.Connector
}

这次的错误信息是:

overriding object session in class AuthInfo; lazy value session in trait Connector of 
type com.datastax.driver.core.Session cannot override final member

希望该消息有助于识别问题。

4

2 回答 2

0

我在这里看到的唯一问题与连接器无关,它在这里:

def getById(page: String): Future[Option[User]] = {
  select.where(_.id eqs id).one()
}

这应该是:

def getById(page: String): Future[Option[User]] = {
  select.where(_.id eqs page).one()
}

试试这个,我能够编译。是RootConnector默认的还是您自己定义的?

于 2016-07-07T07:02:23.500 回答
0

我花了 6 个小时才找出问题所在。这是因为另一个表中有一个名为“会话”的列。事实证明,在选择列名时需要小心。“会话”显然给出了上述例外。Cassandra 还有一长串保留关键字。如果您不小心将其中一个用作列名,幻影将不会抛出任何异常(也许应该?)。不知道 phantom 中是否保留了其他关键字。他们的清单将非常有帮助。

于 2016-07-07T19:06:24.917 回答