Демонстрационный пример

1. Celesta и Spring Boot

Тестовый пример, демонстрирующий возможности Celesta в проекте на основе Spring Boot, доступен здесь: https://github.com/inponomarev/celesta-demo/.

Для создания проекта Spring Boot с помощью Maven необходимо указать следующие зависимости:

    <properties>
       <!-- Проверьте свежую версию ru.curs:spring-boot-starter-web на Maven Central -->
       <spring.boot.starter.celesta.version>2.1.7</spring.boot.starter.celesta.version>
       <!-- Проверьте свежую версию ru.curs:celesta-parent на Maven Central -->
       <celesta.version>7.2.5</celesta.version>
    </properties>

. . .
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>ru.curs</groupId>
            <!-- Собственный Spring Boot starter облегчает конфигурацию Celesta в Spring Boot приложениях -->
            <artifactId>spring-boot-starter-celesta</artifactId>
            <version>${spring.boot.starter.celesta.version}</version>
            <!-- Исключаем зависимость от Celesta, указанную в Celesta spring boot starter,
                 чтобы ниже указать более актуальный номер версии Celesta -->
            <exclusions>
                <exclusion>
                    <groupId>ru.curs</groupId>
                    <artifactId>celesta-system-services</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <!-- Подключаем Celesta более свежей версии, чем предлагает Spring Boot Starter-->
            <groupId>ru.curs</groupId>
            <artifactId>celesta-system-services</artifactId>
            <version>${celesta.version}</version>
        </dependency>
    ...
    </dependencies>

Также для кодогенерации классов доступа к данным понадобится ru.curs:celesta-maven-plugin. В его настройках необходимо указать путь к папке score:

    <build>
        <plugins>
            <plugin>
                <groupId>ru.curs</groupId>
                <artifactId>celesta-maven-plugin</artifactId>
                <version>${celesta.version}</version>

                <executions>
                    <execution>
                        <goals>
                            <goal>gen-cursors</goal>
                            <goal>gen-score-resources</goal>
                            <goal>gen-test-cursors</goal>
                            <goal>gen-test-score-resources</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

В папке src/main/celestasql следует разместить скрипты определения базы данных на языке CelestaSQL. Например,

-- celestasql/ru/curs/demo/demo.sql
CREATE SCHEMA demo VERSION '1.0';

/**Заголовок счёта*/
CREATE TABLE OrderHeader(
  id VARCHAR(30) NOT NULL,
  date DATETIME,
  customer_id VARCHAR(30),

  /**Название клиента */
  customer_name VARCHAR(50),
  manager_id VARCHAR(30),
  CONSTRAINT Pk_OrderHeader PRIMARY KEY (id)
);

/**Строка счёта*/
CREATE TABLE OrderLine(
  order_id VARCHAR(30) NOT NULL,
  line_no INT NOT NULL,
  item_id VARCHAR(30) NOT NULL,
  item_name VARCHAR(100),
  qty INT NOT NULL DEFAULT 0,
  cost REAL NOT NULL DEFAULT 0.0,
  CONSTRAINT Idx_OrderLine PRIMARY KEY (order_id, line_no)
);

ALTER TABLE OrderLine ADD CONSTRAINT fk_OrderLine FOREIGN KEY (order_id) REFERENCES OrderHeader(id);
create materialized view OrderedQty as
select item_id, sum(qty) as qty from OrderLine group by item_id;

Команда mvn verify приведёт к появлению Java-файлов OrderHeaderCursor.java и OrderLineCursor.java с классами курсоров в папке target/generated-sources/celesta/…​.

Эти классы можно использовать при создании сервисов (см. также более полный демонстрационный пример):

@Service
public class DocumentService {
    @CelestaTransaction
    public void postOrder(CallContext context, OrderDto doc) {
        try (OrderHeaderCursor header = new OrderHeaderCursor(context);
             OrderLineCursor line = new OrderLineCursor(context)) {
             . . .
    }
}

Управление настройками проекта осуществляется любым доступным для Spring Boot способом, в частности, с помощью файла application.yml.

2. Использование Celesta совместно со Spring-JDBC

Celesta использует свой собственный пул соединений JDBC, если не предоставлено иной альтернативы. Если вам необходимо использовать какой-либо особенный пул соединений, или если вы желаете использовать DataSource, предоставляемый фреймворком Spring, вы также можете это сделать.

В самостоятельном приложении вы можете использовать метод Celesta.createInstance, подставив DataSource в качестве параметра.

spring-boot-starter-celesta будет автоматически использовать DataSorce, если он предоставлен Spring-ом.

Например, если добавить в проект следующую зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

и прописать следующие аргументы в application.yml

spring:
  datasource:
    url: jdbc:postgresql://<DATABASE>
    username: <USER>
    password: <PWD>
    hikari:
      auto-commit: false
celesta:
  jdbc:
    url: jdbc:postgresql

Celesta запустится с Hikari Connection Pool, предоставленным Spring-ом. Обратите внимание на следующее:

  • Внешний пул соединений должен быть сконфигурирован так, чтобы возвращать соединения с autoCommit установленным в false.

  • Вам всё ещё необходимо прописать параметр celesta.jdbc.url для того, чтобы Celesta определила тип базы данных, с которой она работает. Но т. к. этот параметр не будет использоваться для того, чтобы подключаться к базе данных, достаточно указать только префикс, например jdbc:postgresql, jdbc:sqlserver и т. д.