Рубрики
Без рубрики

Введение в базу данных Spring Data Couchbase

Быстрый и практичный переход к использованию Spring Data Couchbase для взаимодействия с сервером базы данных Couchbase.

Автор оригинала: baeldung.

1. введение

В этом руководстве по данным Spring мы обсудим, как настроить уровень сохраняемости для документов Couchbase, используя как хранилище данных Spring, так и абстракции шаблонов, а также шаги, необходимые для подготовки базы данных Couchbase для поддержки этих абстракций с использованием представлений и/или индексов.

2. Зависимости Maven

Во-первых, мы добавляем следующую зависимость Maven в ваш pom.xml файл:


    org.springframework.data
    spring-data-couchbase
    2.0.0.RELEASE

Обратите внимание, что, включая эту зависимость, мы автоматически получаем совместимую версию собственного SDK Couchbase, поэтому нам не нужно включать ее явно.

Чтобы добавить поддержку проверки компонентов JSR-303, мы также включаем следующую зависимость:


    org.hibernate
    hibernate-validator
    5.2.4.Final

База данных Spring Data Couchbase поддерживает сохранение даты и времени с помощью традиционных классов даты и календаря, а также с помощью библиотеки времени Joda, которую мы включаем следующим образом:


    joda-time
    joda-time
    2.9.2

3. Конфигурация

Затем нам нужно будет настроить среду Couchbase, указав один или несколько узлов вашего кластера Couchbase, а также имя и пароль корзины, в которой мы будем хранить наши документы.

3.1. Конфигурация Java

Для настройки класса Java мы просто расширяем AbstractCouchbaseConfiguration класс:

@Configuration
@EnableCouchbaseRepositories(basePackages={"com.baeldung.spring.data.couchbase"})
public class MyCouchbaseConfig extends AbstractCouchbaseConfiguration {

    @Override
    protected List getBootstrapHosts() {
        return Arrays.asList("localhost");
    }

    @Override
    protected String getBucketName() {
        return "baeldung";
    }

    @Override
    protected String getBucketPassword() {
        return "";
    }
}

Если вашему проекту требуется дополнительная настройка среды Couchbaseenvironment, вы можете предоставить ее, переопределив метод getEnvironment() :

@Override
protected CouchbaseEnvironment getEnvironment() {
   ...
}

3.2. Конфигурация XML

Вот эквивалентная конфигурация в XML:




    
        localhost
    

    

    

    

Примечание: узел ” clusterInfo ” принимает либо учетные данные кластера, либо учетные данные корзины и требуется , чтобы библиотека могла определить, поддерживает ли ваш кластер Couchbase N1QL (надмножество SQL для баз данных NoSQL, доступное в Couchbase 4.0 и более поздних версиях).

Если вашему проекту требуется пользовательская среда Couchbaseenvironment, вы можете предоставить ее с помощью тега .

4. Модель Данных

Давайте создадим класс сущностей, представляющий документ JSON для сохранения. Сначала мы аннотируем класс с помощью @Document, , а затем мы аннотируем поле String с помощью @Id для представления ключа документа Couchbase.

Вы можете использовать либо аннотацию @Id из Spring Data, либо аннотацию из собственного пакета SDK Couchbase. Имейте в виду, что если вы используете обе аннотации @Id в одном классе в двух разных полях, то поле, аннотированное данными Spring @Id аннотацией, будет иметь приоритет и будет использоваться в качестве ключа документа.

Чтобы представить атрибуты документов JSON, мы добавляем частные переменные-члены с аннотациями @Field . Мы используем аннотацию @NotNull для пометки определенных полей по мере необходимости:

@Document
public class Person {
    @Id
    private String id;
    
    @Field
    @NotNull
    private String firstName;
    
    @Field
    @NotNull
    private String lastName;
    
    @Field
    @NotNull
    private DateTime created;
    
    @Field
    private DateTime updated;
    
    // standard getters and setters
}

Обратите внимание, что свойство, помеченное @Id , просто представляет ключ документа и не обязательно является частью сохраненного документа JSON, если оно также не помечено @Field , как в:

@Id
@Field
private String id;

Если вы хотите назвать поле в классе сущностей иначе, чем то, что должно храниться в документе JSON, просто укажите его @Поле аннотацию, как в этом примере:

@Field("fname")
private String firstName;

Вот пример, показывающий, как будет выглядеть сохраненный Человек документ:

{
    "firstName": "John",
    "lastName": "Smith",
    "created": 1457193705667
    "_class": "com.baeldung.spring.data.couchbase.model.Person"
}

Обратите внимание, что Spring Data автоматически добавляет в каждый документ атрибут, содержащий полное имя класса сущности. По умолчанию этот атрибут называется “_class” , хотя вы можете переопределить его в своем классе конфигурации Couchbase , переопределив метод TypeKey () .

Например, если вы хотите назначить поле с именем “Тип данных” для хранения имен классов, вы должны добавить его в свой класс конфигурации Couchbase:

@Override
public String typeKey() {
    return "dataType";
}

Еще одна популярная причина переопределения введите ключ () , если вы используете версию Couchbase Mobile, которая не поддерживает поля с префиксом подчеркивания. В этом случае вы можете выбрать свое собственное поле альтернативного типа, как в предыдущем примере, или вы можете использовать альтернативное поле, предоставленное Spring:

@Override
public String typeKey() {
    // use "javaClass" instead of "_class"
    return MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE;
}

5. Репозиторий Couchbase

База данных Spring Data Couchbase предоставляет те же встроенные запросы и производные механизмы запросов, что и другие модули данных Spring, такие как JPA.

Мы объявляем интерфейс репозитория для класса Person , расширяя CrudRepository<Строка, Персона> и добавляя производный метод запроса:

public interface PersonRepository extends CrudRepository {
    List findByFirstName(String firstName);
}

6. Поддержка N1QL с помощью индексов

Если используется Couchbase 4.0 или более поздней версии, то по умолчанию пользовательские запросы обрабатываются с использованием ядра N1QL (если только соответствующие методы репозитория не помечены @View , чтобы указать использование резервных представлений, как описано в следующем разделе).

Чтобы добавить поддержку N1QL, необходимо создать первичный индекс в корзине. Вы можете создать индекс с помощью обработчика запросов командной строки cbq |/(см. Документацию Couchbase о том, как запустить инструмент cbq для вашей среды) и выполнить следующую команду:

CREATE PRIMARY INDEX ON baeldung USING GSI;

В приведенной выше команде GSI обозначает глобальный вторичный индекс , который является типом индекса , особенно подходящим для оптимизации специальных запросов N1QL в поддержку систем OLTP, и является типом индекса по умолчанию, если не указано иное.

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

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

Например, чтобы добавить индекс в поле имя , выполните следующую команду в инструменте cbq :

CREATE INDEX idx_firstName ON baeldung(firstName) USING GSI;

7. Поддержка Представлений

Для каждого интерфейса репозитория вам нужно будет создать проектный документ Couchbase и одно или несколько представлений в целевом сегменте. Имя проектного документа должно быть в нижнем регистре версией имени класса сущности (например, “человек” ).

Независимо от того, какую версию сервера Couchbase вы используете, вы должны создать резервное представление с именем “все” для поддержки встроенного метода репозитория ” findAll”|/. Вот функция карты для “все” представления для нашего Человека класса:

function (doc, meta) {
    if(doc._class == "com.baeldung.spring.data.couchbase.model.Person") {
        emit(meta.id, null);
    }
}

Пользовательские методы репозитория должны иметь резервное представление при использовании версии Couchbase до версии 4.0 (использование резервных представлений необязательно в версии 4.0 или более поздней версии).

Пользовательские методы, поддерживаемые представлением, должны быть аннотированы с помощью @View , как в следующем примере:

@View
List findByFirstName(String firstName);

Соглашение об именовании по умолчанию для резервных представлений заключается в использовании нижнего регистра версии этой части имени метода после ключевого слова ” найти” (например, “byFirstName” ).

Вот как вы бы написали функцию карты для “по имени” представления:

function (doc, meta) {
    if(doc._class == "com.baeldung.spring.data.couchbase.model.Person"
      && doc.firstName) {
        emit(doc.firstName, null);
    }
}

Вы можете переопределить это соглашение об именовании и использовать свои собственные имена представлений, указав в каждой аннотации @View имя соответствующего резервного представления. Например:

@View("myCustomView")
List findByFirstName(String lastName);

8. Уровень обслуживания

Для нашего уровня обслуживания мы определяем интерфейс и две реализации: одну с использованием абстракции хранилища данных Spring, а другую с использованием абстракции шаблона данных Spring. Вот наш PersonService интерфейс:

public interface PersonService {
    Person findOne(String id);
    List findAll();
    List findByFirstName(String firstName);
    
    void create(Person person);
    void update(Person person);
    void delete(Person person);
}

8.1. Служба репозитория

Вот реализация с использованием репозитория, который мы определили выше:

@Service
@Qualifier("PersonRepositoryService")
public class PersonRepositoryService implements PersonService {
    
    @Autowired
    private PersonRepository repo; 

    public Person findOne(String id) {
        return repo.findOne(id);
    }

    public List findAll() {
        List people = new ArrayList();
        Iterator it = repo.findAll().iterator();
        while(it.hasNext()) {
            people.add(it.next());
        }
        return people;
    }

    public List findByFirstName(String firstName) {
        return repo.findByFirstName(firstName);
    }

    public void create(Person person) {
        person.setCreated(DateTime.now());
        repo.save(person);
    }

    public void update(Person person) {
        person.setUpdated(DateTime.now());
        repo.save(person);
    }

    public void delete(Person person) {
        repo.delete(person);
    }
}

8.2. Сервис Шаблонов

Для реализации на основе шаблона мы должны создать вспомогательные представления, перечисленные в разделе 7 выше. Объект CouchbaseTemplate доступен в нашем контексте Spring и может быть введен в класс обслуживания.

Вот реализация с использованием абстракции шаблона:

@Service
@Qualifier("PersonTemplateService")
public class PersonTemplateService implements PersonService {
    private static final String DESIGN_DOC = "person";
    @Autowired
    private CouchbaseTemplate template;
    
    public Person findOne(String id) {
       return template.findById(id, Person.class);
    }

    public List findAll() {
        return template.findByView(ViewQuery.from(DESIGN_DOC, "all"), Person.class);
    }

    public List findByFirstName(String firstName) {
        return template.findByView(ViewQuery.from(DESIGN_DOC, "byFirstName"), Person.class);
    }

    public void create(Person person) {
        person.setCreated(DateTime.now());
        template.insert(person);
    }

    public void update(Person person) {
        person.setUpdated(DateTime.now());
        template.update(person);
    }

    public void delete(Person person) {
        template.remove(person);
    }
}

9. Заключение

Мы показали, как настроить проект для использования модуля Spring Data Couchbase и как написать простой класс сущностей и его интерфейс репозитория. Мы написали простой интерфейс службы и предоставили одну реализацию с использованием репозитория, а другую реализацию с использованием API шаблона данных Spring.

Вы можете просмотреть полный исходный код этого руководства в проекте GitHub .

Для получения дополнительной информации посетите веб-сайт проекта Spring Data Couchbase .