Моделирование составного ключа раздела Cassandra с использованием Kundera - PullRequest
0 голосов
/ 12 апреля 2019

Я моделирую базу данных Cassandra (3.11) в Java (8), используя Kundera (3.13), и застрял в таблице, которая использует составной ключ раздела.Определение пространства ключей / таблицы:

CREATE KEYSPACE test
WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};

CREATE TABLE test.timeseriesdata (
  asset_id                  TEXT,
  time_series_definition_id TEXT,
  business_date_year        INT,
  business_date             DATE,
  system_time               TIMESTAMP,
  values_blob               MAP<TEXT, BLOB>,
  values_boolean            MAP<TEXT, BOOLEAN>,
  values_double             MAP<TEXT, DOUBLE>,
  values_int                MAP<TEXT, INT>,
  values_text               MAP<TEXT, TEXT>,
  values_timestamp          MAP<TEXT, TIMESTAMP>,
  PRIMARY KEY ((asset_id, time_series_definition_id, business_date_year), business_date, system_time)
) WITH CLUSTERING ORDER BY (business_date DESC, system_time DESC);

Сущность Kundera выглядит следующим образом:

@Embeddable
public class TimeSeriesDataPartitionKey implements Serializable {

    @Column(name = "asset_id")
    private String assetId;

    @Column(name = "time_series_definition_id")
    private String timeSeriesDefinitionId;

    @Column(name = "business_date_year")
    private Integer businessDateYear;
}

@Embeddable
public class TimeSeriesDataPrimaryKey implements Serializable {

    @Embedded
    private TimeSeriesDataPartitionKey key;

    @Column(name = "business_date")
    @Temporal(TemporalType.DATE)
    private Date businessDate;

    @Column(name = "system_time")
    @Temporal(TemporalType.TIMESTAMP)
    private Date systemTime;
}

@Entity
@Table(name = "timeseriesdata", schema = "test@cassandra_pu")
public class TimeSeriesDataEntity {

    @EmbeddedId
    private TimeSeriesDataPrimaryKey key;

    @ElementCollection
    @Column(name = "values_blob")
    private Map<String, byte[]> valuesBlob = new HashMap<>();

    @ElementCollection
    @Column(name = "values_boolean")
    private Map<String, Boolean> valuesBoolean = new HashMap<>();

    @ElementCollection
    @Column(name = "values_double")
    private Map<String, Double> valuesDouble = new HashMap<>();

    @ElementCollection
    @Column(name = "values_int")
    private Map<String, Integer> valuesInt = new HashMap<>();

    @ElementCollection
    @Column(name = "values_text")
    private Map<String, String> valuesText = new HashMap<>();

    @ElementCollection
    @Column(name = "values_timestamp")
    @Temporal(TemporalType.TIMESTAMP)
    private Map<String, Date> valuesTimestamp = new HashMap<>();
}

Я использую <property name="kundera.ddl.auto.prepare" value="validate"/> в файле persistence.xml, чтобы убедиться, чтообъект был смоделирован правильно.Когда я запускаю некоторый код, чтобы попытаться добавить некоторые данные, происходит сбой с сообщением

com.impetus.kundera.configure.schema.SchemaGenerationException: com.impetus.kundera.configure.schema.SchemaGenerationException: Несоответствие схемы !, проверка не удалась.см. таблицу выше для несоответствия

Вот ссылка на таблицу diffchecker, куда я вставил полученное сообщение о несоответствии схемы.Кроме того, я попытался использовать ресурсы из здесь , здесь и здесь , когда я смоделировал сущность Кундеры, как и я.Я просто не могу понять, как это сделать, я отправил письмо своему учителю, и он сказал мне сгладить модель, потому что создание составного ключа невозможно, а теперь мой разум еще более размыт.

РЕДАКТИРОВАТЬ

Если я использую <property name="kundera.ddl.auto.prepare" value="create"/>, тогда код запускается, и если я создаю резервную копию SQL, он выглядит так:

CREATE TABLE test.timeseriesdata (
  asset_id                  TEXT,
  time_series_definition_id TEXT,
  business_date_year        INT,
  business_date             TIMESTAMP,
  system_time               TIMESTAMP,
  values_blob               MAP<TEXT, BLOB>,
  values_boolean            MAP<TEXT, BOOLEAN>,
  values_double             MAP<TEXT, DOUBLE>,
  values_int                MAP<TEXT, INT>,
  values_text               MAP<TEXT, TEXT>,
  values_timestamp          MAP<TEXT, TIMESTAMP>,
  PRIMARY KEY ((asset_id, time_series_definition_id, business_date_year), business_date, system_time)
);

Так что разница в том, что business_date type is TIMESTAMP not DATE иWITH CLUSTERING ORDER BY отсутствует.

Итак, теперь вопрос в том, какой тип java следует использовать для cassandra DATE и почему отсутствует порядок кластеризации?

...