Я моделирую базу данных 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 и почему отсутствует порядок кластеризации?