【问题标题】:phantom cassandra multiple tables throw exceptions幻影cassandra多个表抛出异常
【发布时间】:2016-11-09 06:29:56
【问题描述】:

我正在使用 phantom 在 play 框架中连接 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

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

【问题讨论】:

    标签: scala playframework cassandra phantom-dsl


    【解决方案1】:

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

    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 是默认的还是你自己定义的?

    【讨论】:

    • id 和 page 是错字。它在我的代码中是最新的。问题是每当我定义另一个表 abstract class ConcretePages extends Pages with RootConnector { 时,它在编译时都会失败。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 2016-09-14
      • 1970-01-01
      • 2017-08-25
      • 2015-05-15
      • 2017-11-03
      相关资源
      最近更新 更多