Как смоделировать вложенный класс с помощью драйвера Phantom Cassandra

У меня есть класс case с несколькими вложенными классами. Как мне моделировать с помощью Phantom DSL

Поместить все это в один класс case — не вариант.

Например:

case class Car(age: Int,size: Int,door: Door)
case class Door(color:String, size:Int)

Спасибо


person Ciaran0    schedule 01.03.2016    source источник


Ответы (3)


Что ж, при моделировании вещей на Cassandra вы должны иметь в виду, что она не работает, как реляционные базы данных, и фантом не является разновидностью гибернации.

При моделировании важно учитывать запросы, которые вы хотите выполнить, но давайте перейдем к делу.

Phantom позволяет вам моделировать вложенные классы, используя таблицу json.

Рассмотрим следующее:

case class JsonTest(prop1: String, prop2: String)

case class JsonClass(
  id: UUID,
  name: String,
  json: JsonTest,
  jsonList: List[JsonTest],
  jsonSet: Set[JsonTest]
)

У вас есть внутри столбцов JsonClass 3 с типом класса JsonTest.

При объявлении ваших полей вы должны сделать что-то вроде этого:

object json extends JsonColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

  object jsonList extends JsonListColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

  object jsonSet extends JsonSetColumn[ConcreteJsonTable, JsonClass, JsonTest](this) {
    override def fromJson(obj: String): JsonTest = {
      JsonParser.parse(obj).extract[JsonTest]
    }

    override def toJson(obj: JsonTest): String = {
      compactRender(Extraction.decompose(obj))
    }
  }

В основном то, что делает фантом, - это сохранять строковое представление json внутри строкового столбца.

источник: https://github.com/outworkers/phantom/blob/develop/phantom-dsl/src/test/scala/com/websudos/phantom/tables/JsonTable.scala

person Thiago Pereira    schedule 02.03.2016
comment
Спасибо за помощь. Как это выглядит в Cassandra. Вы можете запрашивать вложенные поля? - person Ciaran0; 02.03.2016
comment
@Ciaran0 это похоже на проанализированный json внутри cassandra, и вы не можете запрашивать поля, а только извлекать их. Datastax работает над новой версией, которая будет поддерживать json, как и Mongo. - person Thiago Pereira; 02.03.2016

Вы не можете этого сделать, потому что это не Hibernate или что-то в этом роде. Вам нужно использовать идентификатор вложенного класса, например:

case class Car(age: Int,size: Int, doorId: UUID)
case class Door(id: UUID, color:String, size:Int)

Затем просто добавьте в класс case функцию, которая возвращает объект Door, вызывающий для него getById.

person znurgl    schedule 01.03.2016
comment
Это то, чего я действительно не хочу делать. Возможно, я удалил Phantom из своего проекта. Мое приложение использует JSON, который имеет несколько вложенных классов, но мне нужно, чтобы исходный объект был сохранен в одной таблице. Спасибо за Ваш ответ. - person Ciaran0; 01.03.2016
comment
Что ж, это сложный и надежный способ создания быстрых и масштабируемых приложений с помощью распределенной базы данных. Вы видели слишком много ORM, как и многие из нас, просто постарайтесь забыть об этом ;-) - person znurgl; 01.03.2016

Попробуйте simpledba https://github.com/doolse/simpledba Кажется, он определяет реляционное представление над столбчатым базы данных.

person SemanticBeeng    schedule 12.05.2017