phantom cassandra 多个表抛出异常
phantom cassandra multiple tables throw exceptions
我正在使用 phantom 连接 play 框架中的 cassandra。按照教程创建第一个 class。一切正常。
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)
}
}
但是,当我尝试按照完全相同的方式创建另一个 table 时,play 在编译时抛出异常:
overriding method session in trait RootConnector of type => com.datastax.driver.core.Session;
我如何创建另一个 table?也有人可以解释导致异常的原因吗?谢谢
编辑
我把连接部分合二为一class:
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
希望该消息有助于确定问题。
我在这里看到的唯一问题不是与连接器有关,而是在这里:
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
是默认的还是你自己定义的?
我花了 6 个小时才弄清楚这个问题。这是因为在另一个table中有一个名为"session"的列。事实证明,您在选择列名时需要小心。 "session" 显然给出了上述异常。 Cassandra 还有一长串保留关键字。如果您不小心使用其中之一作为您的列名,phantom 将不会抛出任何异常(也许应该抛出?)。不知道phantom中有没有保留其他关键字。它们的列表将非常有帮助。
我正在使用 phantom 连接 play 框架中的 cassandra。按照教程创建第一个 class。一切正常。
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)
}
}
但是,当我尝试按照完全相同的方式创建另一个 table 时,play 在编译时抛出异常:
overriding method session in trait RootConnector of type => com.datastax.driver.core.Session;
我如何创建另一个 table?也有人可以解释导致异常的原因吗?谢谢
编辑
我把连接部分合二为一class:
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
希望该消息有助于确定问题。
我在这里看到的唯一问题不是与连接器有关,而是在这里:
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
是默认的还是你自己定义的?
我花了 6 个小时才弄清楚这个问题。这是因为在另一个table中有一个名为"session"的列。事实证明,您在选择列名时需要小心。 "session" 显然给出了上述异常。 Cassandra 还有一长串保留关键字。如果您不小心使用其中之一作为您的列名,phantom 将不会抛出任何异常(也许应该抛出?)。不知道phantom中有没有保留其他关键字。它们的列表将非常有帮助。