代码之家  ›  专栏  ›  技术社区  ›  yang

幻影卡桑德拉多表抛出异常

  •  0
  • yang  · 技术社区  · 8 年前

    我正在使用幻影连接游戏框架中的卡桑德拉。根据教程创建了第一个类。一切都很好。

    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
    

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

    2 回复  |  直到 8 年前
        1
  •  0
  •   flavian    8 年前

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

        2
  •  0
  •   yang    8 年前

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