Если вы посмотрите на карту Греции, то обнаружите небольшой «трезубец» – полуостров Халкидики необычной формы, далеко выступающий в Эгейское море. Самый крайний левый его выступ и есть легендарная Кассандра. На Кассандре расположено больше 40 поселений, в которых проживает около 3500 жителей. Но во время туристического сезона это число увеличивается в десять раз, и полуостров заполняется путешественниками из самой Греции и множества других стран мира. И это можно понять! Большая часть пляжей полуострова имеют «Голубой флаг», подтверждающий чистоту и удобство для отдыхающих.
Кассандра — жемчужина полуострова Халкидики
На Кассандре есть отели (Лучше отели со скидками в Кассандре [ShortConst name=»RoomGuru»]), которые подойдут любителям и бюджетного, и элитного отдыха. Множество баров, ресторанов, ночных клубов и других мест развлечений открыты до самого утра и готовы предоставить посетителям десятки вариантов отдыха. Добавьте к этому богатейшую историю и уникальные памятники древности, удивительную природу и достопримечательности и вы получите идеально место для романтического, семейного или детского туризма.
Посещать Кассандру можно в любое время года. Лето здесь теплое, но не жаркое благодаря мягким морским бризам. Зима не холодная и в отличие от многих мест материковой Греции сухая. И хотя сезон здесь начинается в мае и длится до октября, Кассандру можно рекомендовать в качестве места для отдыха круглый год.
Добраться сюда несложно. Для этого нужно купить билеты на рейс в Салоники или в Афины, а дальше воспользоваться одним из многочисленных комфортабельных рейсовых автобусов, которые несколько раз в день курсируют до Кассандры – столицы полуострова. Поездка обойдется примерно в 15 евро. А лучшим вариантом будет аренда авто (рекомендуем искать авто в Греции на сайте: [ShortConst name=»DiscoverCars»]) – тогда вы сможете сполна насладиться всеми возможностями, которые может предоставить вам Кассандра.
Карта Кассандры
Кассандра и Халкидики на карте Греции.
Если рассмотреть карту, то можно заметить что от материка Кассандра отделена проливом Потидеа, через который переброшен грандиозный мост Неа Потидеа. Именно отсюда открываются самые потрясающие панорамные виды на полуостров и окружающее его море.
Достопримечательности
Главной достопримечательностью Кассандры по праву считаются ее чудесные пляжи и фантастически красивая природа. Но и любители экскурсий найдут, чем заняться на этом полуострове.
Пещерная церковь апостола Павла
Для начала стоит отправиться полюбоваться каналом Потидеа. Здесь в пешей доступности от моста Неа Потидеа вы сможете найти маленькую рыбацкую деревушку Неа Фокиа. Около нее есть масса примечательных мест:
пещерная церковь Апостола Павла;
полуразрушенная византийская крепость;
заповедник дикой природы;
фольклорный музей и другие интересные для посещения достопримечательности.
Дальше дорога приведет вас в Афитос, который считается самым красивым курортом Кассандры. Главная гордость местного населения – церковь Св. Дмитрия. Внутри вы сможете увидеть редкие и древние мозаики, старинную церковную утварь и иконы. Неподалеку от поселка расположились античные каменоломни. Не забудьте заглянуть в этнографический музей. История Кассандры очень интересна и ведет свое начало со времен Древней Греции.
Теперь переместимся на восточное побережье полуострова. Здесь нас ждет поселок Каллитея. Расположенный тут храм Амона Зевса был построен еще в IV веке до нашей эры. Простые и строгие линии, дорический стиль архитектуры позволяет окунуться в глубины веком и почувствовать атмосферу античности.
Не меньшее впечатление на путешественников производит и Святилище Диониса, расположенное неподалеку. Это небольшая пещера, попасть в которую можно по вырубленной в скале лестнице.
Еще одна достопримечательность относится к временам еще более давним, чем античность. Пещера Петралона – место обнаружения останков самого древнего человека в Европе. Кроме того, здесь были найдены следы первобытных костров. Небольшая экскурсия в пещере длится недолго, но позволяет увидеть места раскопок, а также оценить красоту сталактитов и сталагмитов.
Отели Кассандры
Sani Asterias Suites
Отели Кассандры, как и всей Греции, порадуют каждого путешественника. Здесь есть и роскошные дорогие гостиницы, и скромные дешевые пансионы. Большая их часть находится в непосредственной близости от моря и пляжа, поэтому обеспечат вам комфортный отдых.
Sani Asterias Suites
Для ценителей отдыха класса люкс можно порекомендовать сразу несколько отелей. Один их самых фешенебельных и дорогих пятизвездочных отелей — Sani Asterias Suites. Всего 48 номеров этого бутик-отеля предлагают постояльцам уникальные условия для отдыха. Частный пляж, изысканный ресторан, чудесные виды на море и гору Олимп, сьюты с выходом к морю или в небольшой садик, мраморные ванные комнаты, французские окна в пол, террасы с ротанговой мебелью в каждом номере позволят вам сполна насладиться заслуженным отдыхом. Специально для постояльцев на территории отеля есть несколько бассейнов, спа-зона и детский клуб.
[ShortConst name=»sputnik8″]
Daphne Holiday Club
Если вы не готовы платить за отель больше 500 евро, то обратите внимание на бюджетные варианты. Например, трехзвездочный Daphne Holiday Club можно считать прекрасным вариантом, для тех, кто ценит свои деньги и при этом не экономит на качестве. Десять двухэтажных зданий, расположенных на невысоком и живописном холме подарят своим постояльцам тишину и комфортное размещение. Из каждого номера открывается вид на море, а в некоторых еще и удобная мини-кухня. Для гостей есть фитнес-центр, детский мини-клуб, теннисный корт. Бесплатный пляж с мягким и мелким песком расположен всего в нескольких минутах ходьбы.
Ioli Village Hotel Apartments
Ioli Village Hotel Apartments
Если же в ваши планы не входят особые траты на отель в Кассандре, то можно поселиться в Ioli Village Hotel Apartments. К вашим услугам будут небольшие двухкомнатные апартаменты с кухней, небольшой бассейн на территории и красивая территория. Неподалеку от отеля расположен курортный поселок, где вы сможете без труда найти хороший ресторанчик, дискотеку или бар. Любителям уединенного отдыха стоит обратить внимание на виллы и небольшие семейные отели.
Пляжи
Рассказать о Кассандре невозможно без упоминания ее пляжей. Общая их протяженность равна 50 км и на всем протяжении это очень ухоженные и обустроенные места для отдыха, соответствующие самым высоким стандартам.
Самый популярный у туристов пляж Кассандры расположен возле небольшого кемпинга Сани.
Мелкий песок, теплое мелководье, идеальная чистота как нельзя лучше подходят для отдыха с детьми. Лежаки и зонтики здесь можно арендовать за несколько евро на целый день, а десятки кафе, баров, ресторанчиков и даже полноценный супермаркет сделают ваш отдых комфортным.
Пляж возле поселка Криопи
Самый живописный пляж находится возле поселка Криопи. Главный его плюс – отсутствие отелей поблизости. Белоснежный песок, довольно крутой обрыв, поросший сосновым бором, чистейшее синее море и развитая инфраструктура позволят вам сполна насладиться тишиной и солнечным теплом.
[ShortConst name=»mult2_kz»]
В отличие от всех остальных пляжей, пляж поселка Полихроно не выглядит отдельной дикой бухтой. Песчаный берег тянется вдоль прогулочного бульвара, тут и там разбросаны небольшие отельчики, а кафе, рестораны, детские игровые автоматы расположены в шаговой доступности. Ну и, конечно же, любой пляж на побережье порадует вас чистым морем, удобным входом в воду, мягким песком и целым комплексом развлечений для взрослых и детей. Поэтому смело можно рекомендовать любой из них – вы не разочаруетесь! Кассандра ждет гостей круглый год. Приехав сюда однажды, вы будете с радостью возвращаться вновь и вновь. Ведь каждый раз вас будет ждать незабываемый отдых и встреча с самым прекрасным полуостровом Европы.
Карта полуострова Кассандра / Travel.Ru / Страны / Греция / Карты
Travel. ru
Страны
Греция
Карты
Карта полуострова Кассандра
Отели
Авиабилеты
Рассказать о личном опыте (Ваш текст появится на сайте после проверки редактором)
Греция приостанавливает выдачу виз россиянам на неопределенный срок
Греция отменяет требование носить медицинские маски
Какие продукты и почему отбирают у туристов?
Как выбрать пляжный курорт в России: путеводитель, советы
8 правил выживания в постсоветском отеле
Страны безвизового или упрощённого въезда для граждан РФ
Таможенные правила ввоза алкоголя
Таможенные правила России
Виза в США — так ли это страшно?
Документы для биометрического паспорта
Как декларировать деньги в аэропорту и на других пограничных пунктах
spring-data-cassandra/mapping.
adoc на главной · spring-projects/spring-data-cassandra · GitHub
Постоянная ссылка
Тег с указанным именем ветки уже существует. Многие команды Git принимают имена как тегов, так и веток, поэтому создание этой ветки может привести к неожиданному поведению. Вы уверены, что хотите создать эту ветку?
Перейти к файлу
В настоящее время не удается получить участников
Расширенная поддержка сопоставления объектов обеспечивается MappingCassandraConverter . MappingCassandraConverter имеет богатую модель метаданных, которая предоставляет полный набор функций для сопоставления объектов предметной области с таблицами CQL.
Модель метаданных сопоставления заполняется с помощью аннотаций к объектам домена.
Однако инфраструктура не ограничивается использованием аннотаций в качестве единственного источника метаданных. MappingCassandraConverter также позволяет сопоставлять объекты предметной области с таблицами без предоставления каких-либо дополнительных метаданных, следуя ряду соглашений.
В этой главе мы опишем функции MappingCassandraConverter , как использовать соглашения для сопоставления объектов предметной области с таблицами и как переопределить эти соглашения с помощью метаданных сопоставления на основе аннотаций.
В этом разделе объясняется, как типы сопоставляются с представлением Apache Cassandra и из него.
Spring Data для Apache Cassandra поддерживает несколько типов, предоставляемых Apache Cassandra.
В дополнение к этим типам Spring Data для Apache Cassandra предоставляет набор встроенных преобразователей для сопоставления дополнительных типов.
Вы можете предоставить свои собственные преобразователи для настройки преобразования типов.
Дополнительные сведения см. в разделе «[cassandra.mapping.explicit-converters]».
В следующей таблице типы данных Spring сопоставляются с типами Cassandra:
Таблица 1. Тип
Тип
Тип Кассандры
Строка
текст (по умолчанию), varchar , ascii
двойной , двойной
двойной
с плавающей запятой , с плавающей запятой
поплавок
длинный , длинный
bigint (по умолчанию), счетчик
целое число , Целое число
внутр.
короткий , короткий
малое целое
байт , байт
крошечный
логическое значение , логическое значение
логический
BigInteger
вариант
BigDecimal
десятичный
java.util.Дата
метка времени
com.datastax.driver.core.LocalDate
дата
InetAddress
инет
Байтбуфер
капля
java. util.UUID
идентификатор пользователя
TupleValue , сопоставленные типы кортежей
кортеж<…>
UDTValue , сопоставленные пользовательские типы
тип пользователя
java.util.Map
карта
java.util.List
список
java.util.Set
набор
Перечисление
text (по умолчанию), bigint , varint , int , smallint , tinyint
Каждый поддерживаемый тип соответствует стандартному
Тип данных Кассандра.
Типы Java можно сопоставить с другими типами Cassandra с помощью @CassandraType , как показано в следующем примере:
MappingCassandraConverter использует несколько соглашений для сопоставления объектов домена с таблицами CQL, когда не предоставляются дополнительные метаданные сопоставления.
Условные обозначения:
Простое (короткое) имя класса Java сопоставляется с именем таблицы путем преобразования в нижний регистр.
Например, com.bigbank.SavingsAccount сопоставляется таблице с именем SavingsAccount .
Преобразователь использует любой зарегистрированный преобразователь Spring Converter , чтобы переопределить сопоставление свойств объектов по умолчанию со столбцами таблиц.
Свойства объекта используются для преобразования в столбцы таблицы и обратно.
Вы можете изменить соглашения, настроив NamingStrategy на CassandraMappingContext .
Объекты стратегии именования реализуют соглашение, согласно которому таблица, столбец или определяемый пользователем тип являются производными от класса сущностей и от фактического свойства.
В следующем примере показано, как настроить Namingstrategy :
Пример 2. Настройка Namingstrategy на CassandrampingContext
Если явно не настроено, экземпляр MappingCassandraConverter создается по умолчанию при создании CassandraTemplate .
Вы можете создать свой собственный экземпляр MappingCassandraConverter , чтобы указать, где сканировать путь к классам при запуске для классов вашего домена для извлечения метаданных и построения индексов.
Кроме того, создав свой собственный экземпляр, вы можете зарегистрировать экземпляры Spring Converter для использования для сопоставления определенных классов с базой данных и из нее.
В следующем примере класса конфигурации устанавливается поддержка сопоставления Cassandra:
Пример 3. Класс @Configuration для настройки поддержки сопоставления Cassandra
AbstractCassandraConfiguration требует, чтобы вы реализовали методы, определяющие пространство ключей.
AbstractCassandraConfiguration также имеет метод с именем getEntityBasePackages(…) .
Вы можете переопределить его, чтобы указать конвертеру, где сканировать классы, аннотированные аннотацией @Table .
Вы можете добавить дополнительные преобразователи в MappingCassandraConverter , переопределив метод customConversions .
Примечание
AbstractCassandraConfiguration создает экземпляр CassandraTemplate и регистрирует его в контейнере под именем cassandraTemplate .
Сопоставление на основе метаданных
Чтобы в полной мере воспользоваться функциями сопоставления объектов в рамках поддержки Spring Data для Apache Cassandra, вы должны аннотировать сопоставленные объекты домена с помощью @Table 9.Аннотация 0014.
Это позволяет сканеру путей к классам находить и предварительно обрабатывать объекты домена для извлечения необходимых метаданных.
Для выполнения действий схемы используются только аннотированные сущности.
В худшем случае операция SchemaAction.RECREATE_DROP_UNUSED удаляет ваши таблицы, и вы теряете свои данные.
В следующем примере показан простой объект домена:
Пример 4. Пример объекта домена
package com. mycompany.domain;
@Таблица
общественный класс Person {
@Идентификатор
частный строковый идентификатор;
@CassandraType(тип = Имя.VARINT)
личное целое ssn;
частная строка firstName;
частная строка фамилия;
}
Важно
Аннотация @Id сообщает программе сопоставления, какое свойство вы хотите использовать для первичного ключа Cassandra.
Для составных первичных ключей может потребоваться немного другая модель данных.
Работа с первичными ключами
Для Cassandra требуется по крайней мере одно поле ключа раздела для таблицы CQL.
В таблице можно дополнительно объявить одно или несколько ключевых полей кластеризации.
Если ваша таблица CQL содержит составной первичный ключ, вы должны создать @PrimaryKeyClass для определения структуры составного первичного ключа.
В этом контексте «составной первичный ключ» означает один или несколько столбцов раздела, которые могут быть дополнительно объединены с одним или несколькими столбцами кластеризации.
Первичные ключи могут использовать любой единственный простой тип Cassandra или отображаемый пользовательский тип.
Первичные ключи коллекции не поддерживаются.
Простые первичные ключи
Простой первичный ключ состоит из одного поля ключа раздела в классе объектов.
Поскольку это только одно поле, мы можем с уверенностью предположить, что это ключ раздела.
В следующем листинге показана таблица CQL, определенная в Cassandra, с первичным ключом 9.0013 user_id :
Пример 5. Таблица CQL, определенная в Cassandra
Пользователь CREATE TABLE (
текст user_id,
текст имени,
текст фамилии,
ПЕРВИЧНЫЙ КЛЮЧ (user_id))
;
В следующем примере показан аннотированный класс Java, соответствующий классу Cassandra, определенному в предыдущем листинге:
Пример 6. Аннотированный объект
@Table(value = "login_event")
открытый класс LoginEvent {
@PrimaryKey("user_id")
приватная строка идентификатор пользователя;
частная строка имя;
частная строка фамилия;
// геттеры и сеттеры опущены
}
Составные ключи
Составные первичные ключи (или составные ключи) состоят из более чем одного поля первичного ключа.
При этом составной первичный ключ может состоять из нескольких ключей раздела, ключа раздела и ключа кластеризации или множества полей первичного ключа.
Составные ключи могут быть представлены двумя способами с помощью Spring Data для Apache Cassandra:
Простейшая форма составного ключа — это ключ с одним ключом раздела и одним ключом кластеризации.
В следующем примере показан оператор CQL для представления таблицы и ее составного ключа:
Пример 7. Таблица CQL с составным первичным ключом
CREATE TABLE login_event(
текст person_id,
код_события целое,
временная метка event_time,
ip_адрес текст,
ПЕРВИЧНЫЙ КЛЮЧ (person_id, event_code, event_time))
С КЛАСТЕРИЗАЦИИ ORDER BY (событие_время DESC)
;
Плоские составные первичные ключи
Плоские составные первичные ключи встраиваются внутрь объекта в виде плоских полей.
Поля первичного ключа аннотируются
@PrimaryKeyColumn .
Для выбора требуется либо запрос, содержащий предикаты для отдельных полей, либо использование Идентификатор карты .
В следующем примере показан класс с простым составным первичным ключом:
Пример 8. Использование плоского составного первичного ключа
link:../{example-root}/LoginEvent.java[]
Класс первичного ключа
A класс первичного ключа — это составной класс первичного ключа, который сопоставляется с несколькими полями или свойствами объекта.
Он аннотирован @PrimaryKeyClass и должен определять методы equals и hashCode .
Семантика равенства значений для этих методов должна быть согласована с равенством баз данных для типов баз данных, которым сопоставлен ключ.
Классы первичных ключей можно использовать с репозиториями (как Id type) и для представления идентичности объекта в одном сложном объекте.
В следующем примере показан класс составного первичного ключа:
Пример 9. Класс составного первичного ключа
ссылка:../{example-root}/LoginEventKey.java[]
В следующем примере показано, как использовать составной первичный ключ :
Пример 10. Использование составного первичного ключа
@Table(value = "login_event")
открытый класс LoginEvent {
@Первичный ключ
закрытый ключ LoginEventKey;
@Колонка("ip_адрес")
частный строковый IP-адрес;
// геттеры и сеттеры опущены
}
Поддержка встроенных сущностей
Встроенные сущности используются для разработки объектов-значений в модели предметной области Java, свойства которых сведены в таблицу.
В следующем примере вы видите, что User.name имеет аннотацию @Embedded .
Следствием этого является то, что все свойства UserName складываются в таблицу user , которая состоит из 3 столбцов ( user_id , firstname , lastname ).
Примечание
Встроенные объекты могут содержать только простые типы свойств.
Невозможно вложить один встроенный объект в другой встроенный.
Однако, если значения столбцов firstname и lastname на самом деле null в наборе результатов, все свойство name будет установлено в null в соответствии с onEmpty of 9014 of
013 @Embedded
, которые null s объекты, когда все вложенные свойства null . В противоположность этому поведению USE_EMPTY пытается создать новый экземпляр, используя либо конструктор по умолчанию, либо конструктор, который принимает значения параметров, допускающие значение NULL, из набора результатов.
Пример 11. Пример кода встраивания объектов
public class User {
@PrimaryKey("user_id")
приватная строка идентификатор пользователя;
@Embedded(onEmpty = USE_NULL) (1)
Имя пользователя;
}
имя_пользователя открытого класса {
частная строка имя;
частная строка фамилия;
}
Свойство равно null , если имя и фамилия равны null .
Используйте onEmpty=USE_EMPTY для создания экземпляра UserName с потенциальным значением null для его свойств.
Вы можете внедрить объект значения в сущность несколько раз, используя необязательный префикс элемента аннотации @Embedded .
Этот элемент представляет собой префикс и добавляется к каждому имени столбца во внедренном объекте.
Обратите внимание, что свойства будут перезаписывать друг друга, если несколько свойств отображаются в одно и то же имя столбца.
Наконечник
Используйте ярлыки @Embedded.Nullable и @Embedded.Empty для @Embedded(onEmpty = USE_NULL) и @Embedded(onEmpty = USE_EMPTY) , чтобы уменьшить многословность и одновременно установить JSR-015 javax.annotation.Nonnull соответственно.
открытый класс MyEntity {
@Идентификатор
Целочисленный идентификатор;
@Embedded. Nullable (1)
EmbeddedEntity встроенный объект;
}
Ярлык для @Embedded(onEmpty = USE_NULL) .
Обзор аннотации сопоставления
MappingCassandraConverter может использовать метаданные для управления сопоставлением объектов со строками в таблице Cassandra.
Ниже приводится обзор аннотаций:
@Id : применяется на уровне поля или свойства для обозначения свойства, используемого для целей идентификации.
@Table : применяется на уровне класса, чтобы указать, что этот класс является кандидатом на сопоставление с базой данных.
Вы можете указать имя таблицы, в которой хранится объект.
@PrimaryKey : аналогично @Id , но позволяет указать имя столбца.
@PrimaryKeyColumn : специфичная для Cassandra аннотация для столбцов первичного ключа, которая позволяет указать атрибуты столбца первичного ключа, например, для кластеризованного или секционированного.
Может использоваться для одного или нескольких атрибутов для указания либо одного, либо составного (составного) первичного ключа.
Если используется для свойства внутри объекта, обязательно примените @Id аннотация.
@PrimaryKeyClass : применяется на уровне класса, чтобы указать, что этот класс является классом составного первичного ключа.
Должен быть указан с @PrimaryKey в классе сущности.
@Transient : по умолчанию все частные поля сопоставляются со строкой.
Эта аннотация исключает поле, в котором она применяется, из хранения в базе данных.
Переходные свойства нельзя использовать в конструкторе постоянства, поскольку преобразователь не может материализовать значение для аргумента конструктора.
@PersistenceConstructor : Помечает заданный конструктор — «даже защищенный пакетом» — для использования при создании экземпляра объекта из базы данных.
Аргументы конструктора сопоставляются по имени со значениями ключа в извлеченной строке.
@Value : Эта аннотация является частью Spring Framework. В структуре сопоставления его можно применять к аргументам конструктора.
Это позволяет вам использовать оператор Spring Expression Language для преобразования значения ключа, полученного в базе данных, до того, как оно будет использовано для создания объекта предметной области.
Чтобы сослаться на свойство данного Строка / UdtValue / TupleValue необходимо использовать такие выражения, как: @Value("#root.getString(0)") где root относится к корню данного документа.
@ReadOnlyProperty : применяется на уровне поля, чтобы пометить свойство как доступное только для чтения.
Операторы вставки и обновления, привязанные к объекту, не включают это свойство.
@Колонка : Применяется на уровне поля.
Описывает имя столбца, как оно представлено в таблице Cassandra, что позволяет имени отличаться от имени поля класса.
Может использоваться в аргументах конструктора для настройки имени столбца во время создания конструктора.
@Embedded : Применяется на уровне поля.
Разрешает использование встроенных объектов для типов, сопоставленных с таблицей или пользовательским типом.
Свойства внедренного объекта сводятся к структуре его родителя.
@Indexed : Применяется на уровне поля.
Описывает индекс, который будет создан при инициализации сеанса.
@SASI : Применяется на полевом уровне.
Разрешает создание индекса SASI во время инициализации сеанса.
@CassandraType : применяется на уровне поля для указания типа данных Cassandra.
Типы по умолчанию получаются из объявления свойств.
@Frozen : Применяется на уровне поля к типам классов и параметризованным типам.
Объявляет фиксированный столбец определяемого пользователем типа или фиксированную коллекцию, например List<@Frozen UserDefinedPersonType> .
@UserDefinedType : применяется на уровне типа для указания определяемого пользователем типа данных Cassandra (UDT).
Типы получаются из объявления по умолчанию.
@Tuple : применяется на уровне типа для использования типа в качестве сопоставленного кортежа.
@Element : применяется на уровне поля для указания порядкового номера элемента или поля в сопоставленном кортеже.
Типы по умолчанию получаются из объявления свойств.
Может использоваться в аргументах конструктора для настройки порядковых номеров элементов кортежа во время создания конструктора.
@Version : применяется на уровне поля, используется для оптимистичной блокировки и проверяется на изменение при операциях сохранения.
Начальное значение ноль , который автоматически обновляется при каждом обновлении.
Инфраструктура метаданных сопоставления определена в отдельном проекте spring-data-commons, который не зависит ни от технологии, ни от хранилища данных.
В следующем примере показано более сложное сопоставление:
Пример 12. Сопоставление Person class
link:../{example-root}/mapping/Person.java[]
В следующем примере показано, как выполнить сопоставление UDT Адрес :
Пример 13. Сопоставленный определяемый пользователем тип Адрес
ссылка:../{example-root}/mapping/Address.java[]
Примечание
Для работы с пользовательскими типами требуется UserTypeResolver , настроенный с контекстом сопоставления.
См. главу конфигурации, чтобы узнать, как настроить UserTypeResolver .
В следующем примере показано, как сопоставить кортеж:
Пример 14. Сопоставленный кортеж
link:../{example-root}/mapping/Coordinates.java[]
Создание индекса
Вы можете аннотировать определенные свойства объекта с помощью @Indexed или @SASI , если вы хотите создать вторичные индексы на запуск приложения.
При создании индекса создаются простые вторичные индексы для скалярных типов, определяемых пользователем типов и типов коллекций.
Вы можете настроить индекс SASI для применения анализатора, например StandardAnalyzer или NonTokenizingAnalyzer (с помощью
@StandardAnalyzed и @NonTokenizingAnalyzed соответственно).
Типы карт различают индексы ENTRY , KEYS и VALUES .
При создании индекса тип индекса определяется из аннотированного элемента.
В следующем примере показано несколько способов создания индекса:
Аннотацию @Indexed можно применять к отдельным свойствам встроенных объектов или вместе с аннотацией @Embedded , и в этом случае индексируются все свойства встроенных объектов.
Осторожно
Создание индекса при инициализации сеанса может серьезно повлиять на производительность при запуске приложения.
Cassandra не предоставляет средств для генерации идентификаторов при вставке данных.
Как следствие, объекты должны быть связаны со значениями идентификатора.
Spring Data по умолчанию использует проверку идентификатора, чтобы определить, является ли сущность новой.
Если вы хотите использовать аудит, обязательно используйте [cassandra.template.optimistic-locking] или реализуйте Persistable для правильного определения состояния объекта.
Lifecycle Events
Платформа сопоставления Cassandra имеет несколько встроенных событий org.springframework.context.ApplicationEvent , на которые ваше приложение может реагировать, регистрируя специальные компоненты в ApplicationContext .
Будучи основанным на инфраструктуре событий контекста приложения Spring, другие продукты, такие как Spring Integration, могут легко получать эти события, поскольку они являются хорошо известным механизмом обработки событий в приложениях на основе Spring.
Чтобы перехватить объект до того, как он попадет в базу данных, вы можете зарегистрировать подкласс org. springframework.data.cassandra.core.mapping.event.AbstractCassandraEventListener , который переопределяет метод onBeforeSave(…) .
Когда событие отправляется, ваш слушатель вызывается и передает объект домена (который является сущностью Java).
События жизненного цикла объекта могут быть дорогостоящими, и вы можете заметить изменение профиля производительности при загрузке больших наборов результатов.
Вы можете отключить события жизненного цикла в Template API.
В следующем примере используется onBeforeSave метод:
Объявление этих bean-компонентов в Spring ApplicationContext заставит их вызываться всякий раз, когда событие отправляется.
AbstractCassandraEventListener имеет следующие методы обратного вызова:
onBeforeSave : Вызывается в операциях CassandraTemplate. insert(…) и .update(…) перед вставкой или обновлением строки в базе данных.
onAfterSave : Вызывается в CassandraTemplate…insert(…) и .update(…) операций после вставки или обновления строки в базе данных.
onBeforeDelete : Вызывается в CassandraTemplate.delete(…) операциях перед удалением строки из базы данных.
onAfterDelete : Вызывается в CassandraTemplate.delete(…) операциях после удаления строки из базы данных.
onAfterLoad : Вызывается в методах CassandraTemplate.select(…) , .slice(…) и .stream(…) после извлечения каждой строки из базы данных.
onAfterConvert : Вызывается в методах CassandraTemplate.select(…) , . slice(…) и .stream(…) после преобразования строки, полученной из базы данных, в POJO.
Примечание
События жизненного цикла генерируются только для типов корневого уровня.
Сложные типы, используемые в качестве свойств в корне агрегата, не подлежат публикации событий.