2017-12-01 6 views
3

Ich versuche, unsere aktuelle Implementierung von Phantom 1.28.16 zu 2.16.4 zu migrieren, aber ich habe Probleme mit dem Setup.Verwenden von Phantom 2 mit einer vorhandenen Cassandra-Sitzung

Unser Framework stellt uns während des Startvorgangs das Cassandra-Session-Objekt zur Verfügung, das nicht in Phantom passt. Ich versuche, Phantom dazu zu bringen, die bereits instanziierte Sitzung zu akzeptieren, anstatt das reguläre CassandraConnection-Objekt zu durchlaufen.

Ich nehme an, dass wir die Phantom-Datenbank-Klasse aus diesem Grund nicht verwenden können, aber ich hoffe, dass es noch eine Möglichkeit gibt, die Tabellen einzurichten und zu verwenden, ohne diese Klasse zu verwenden.

Ist das machbar?

+0

Wir brauchen auch, dass für die Verwendung von lagom mit Phantom-dsl. Vielleicht benutzen Sie auch Lagom. Wenn Sie auch Lagom verwenden, fügen Sie bitte ein Tag für Lagom hinzu. Danke –

+0

Nein, wir verwenden Lagom nicht –

+0

@JohanJ Was ist das Problem mit der Verwendung der DB-Klasse? Ich würde es gerne besser verstehen. – flavian

Antwort

0

I endete die folgende Lage sein Phantom zu verwenden, um mit einer bestehenden Verbindung nach oben zu tun:

eine neue Eigenschaft Definierte PhantomTable anstelle von Phantom ‚Table‘ Merkmale verwendet werden. Sie sind identisch mit Ausnahme der Entfernung der RootConnector

trait PhantomTable[T <: PhantomTable[T, R], R] extends CassandraTable[T, R] with TableAliases[T, R] 

Defined meiner Tabellen durch den PhantomTable Zug erstreckt, und machten es auch zu einem Objekt. Hier hatte ich all die TableHelper Makro zu importieren, um sie

... 
import com.outworkers.phantom.macros.TableHelper._ 

final case class Foo(id: String, name: Option[String]) 

sealed class FooTable extends PhantomTable[FooTable, Foo] { 
    override val tableName = "foo" 

    object id    extends StringColumn with PartitionKey 
    object name   extends OptionalStringColumn 
} 

object FooTable extends FooTable 

Nach kompilieren zu erhalten, dass es möglich ist, alle gewünschten Methoden auf dem FooTable Objekt zu verwenden, solange eine implizite Schlüsselraum und Session besteht im Rahmen.

Dies ist ein einfaches Hauptprogramm, das zeigt, wie die Tabellen

verwendet werden können
object Main extends App { 
    val ks = "foo_keyspace" 
    val cluster = Cluster.builder().addContactPoints("127.0.0.1").build() 

    implicit val keyspace: KeySpace = KeySpace(ks) 
    implicit val session: Session = cluster.connect(ks) 

    val res = for { 
    _ <- FooTable.create.ifNotExists.future 
    _ <- FooTable.insert.value(_.id, "1").value(_.name, Some("data")).future 
    row <- FooTable.select.where(_.id eqs "1").one 
    } yield row 

    val r = Await.result(res, 10.seconds) 
    println(s"Row: $r") 
} 
Verwandte Themen