2016-07-07 2 views
0

Я использую фантом для подключения кассандры в игровой среде. Создал первый класс после учебника. Все работает нормально.phantom 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) 
    } 
} 

Однако, когда я пытаюсь создать еще одну таблицу после точно так же, игра бросает исключение при компиляции:

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

Как я мог бы построить создать еще одну таблицу? Также может кто-нибудь объяснить, что вызывает исключение? Благодарю.

EDIT

я переместил часть соединения вместе в одном классе:

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 

Надежда сообщение помогает определить проблему.

ответ

0

Мне потребовалось 6 часов, чтобы выяснить проблему. Это потому, что в другой таблице есть столбец с именем «session». Оказывается, вам нужно быть осторожным при выборе имен столбцов. «Сессия», очевидно, дает вышеизложенное исключение. В Cassandra также есть длинный список зарезервированных ключевых слов. Если вы случайно используете один из них в качестве имени столбца, фантом не будет бросать никаких исключений (может быть, он должен?). Я не знаю, зарезервированы ли какие-либо другие ключевые слова в фантоме. Список из них будет очень полезен.

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 по умолчанию один или вы сами определяете другого?

+0

ID и страница страницы - это опечатка. Это актуально в моем коде. Проблема заключается в том, что когда я определяю другую таблицу, «абстрактный класс ConcretePages расширяет страницы с RootConnector {', он терпит неудачу при компиляции. – yang