Статьи

Java 8: пристальный взгляд на Speedment 3.0.1 «Лесной» поток ORM

По дороге

Я принимал участие в проекте с открытым исходным кодом Speedment (который является Stream ORM Java Toolkit и Runtime), и только что была выпущена новая основная версия под названием 3.0.1 «Forest». Релизы названы в честь авеню в Пало-Альто, штат Калифорния, где работает большинство авторов. Каждый новый крупный релиз получает новое имя, следуя по Middlefield Road на юг. Новая версия теперь является модульной, что помогает разработчикам поддерживать хороший темп. Существует также большое количество новых функций для пользователей Speedment, и в этой статье мы рассмотрим некоторые из открытий!

Упорство

Люди, привыкшие к более старым ORM, теперь могут использовать Speedment таким же образом при создании, обновлении или удалении объектов из базы данных. Например, мы можем создать сущности в базе данных «в стиле JPA» следующим образом:

1
2
3
4
5
6
Hare hare = new HareImpl();
hare.setName("Flopsy");
hare.setAge(1);
hare.setColor("Gray");
 
entityManager.persist(hare);  // Persists (=inserts) the new Hare in the database

Хотя это не большое изменение, это все же удобно.

Декларативный состав потока

Запросы к базе данных ускорения выражаются в виде операций на стандартных потоках Java 8. В новой версии API-интерфейс Speedment предоставляет методы, которые возвращают функции, а не работают непосредственно с объектами. Это упрощает так называемое декларативное составление потока, что просто означает, что становится проще и эффективнее записывать потоки.

Давайте подробнее рассмотрим пример, в котором мы хотим объединить объекты из двух разных таблиц. У нас есть две таблицы «заяц» и «морковь», где «морковь» имеет поле с именем «владелец», которое является внешним ключом для столбца «заяц». «Id». Задача состоит в том, чтобы создать карту, которая содержит все объекты Hare в качестве ключей и объекты списка моркови, принадлежащие конкретному Hare, через его внешний ключ в качестве значений. Это можно выразить так:

1
2
3
4
Map<Hare, List<Carrot>> joinMap = carrots.stream()
    .collect(
        groupingBy(hares.finderBy(Carrot.OWNER)) // Applies the finderBy(Carrot.OWNER) classifier
    );


goupingBy() принимает
Function которая отображает из
Carrot к
Hare сущность. Таким образом, работая с методами, которые возвращают функции, наш код становится очень компактным. Это также открывает будущие способы оптимизации потока, поскольку эти функции могут быть идентифицированы и проанализированы в конвейере потока до его запуска. Следует отметить, что оба
collect() и
Методы groupingBy() являются стандартными методами Java 8.

Еще лучшая генерация кода

Speedment генерирует код автоматически из данных схемы базы данных. Одна из полезных особенностей Speedment заключается в том, что мы можем видеть, понимать и изменять сгенерированный код. Это делает вещи менее «волшебными» по сравнению с другими ORM и ставит разработчика в рабочее место. Новые функции генерации кода включают в себя:

Поддержка примитивных типов

Теперь мы можем использовать примитивные типы, такие как
int ,
long или
double столбцы и улучшить скорость выполнения и использование памяти. Обнуляемые поля могут быть сопоставлены со специализированными
Optional типы, такие как
OptionalInt ,
OptionalLong и
OptionalDouble совместимо со стилем кода Java 8.

Модульная генерация кода

Мы можем подключить нашу собственную логику генерации кода и адаптировать генератор кода по умолчанию. Это пригодится нам, разработчикам, которые могут глубоко понять нашу модель предметной области и захотят использовать эти знания. Когда новые функции добавляются путем настройки генератора кода, эти новые функции будут немедленно применены ко всему сгенерированному коду. Кодируй код и получай кредитное плечо!

Режим совместимости

Некоторые старые решения не готовы к
Optional поля и, таким образом, был добавлен новый режим «совместимости», в котором, например, в качестве
Integer а не как
OptionalInt

Настраиваемое пространство имен

Теперь мы можем настроить генератор кода так, чтобы сущности, менеджеры и объекты конфигурации помещались индивидуально в любое пространство имен. Это хорошо для модульных проектов.

Улучшенный рендерер кода

Speedment использует парадигму Model View Controller (MVC) для генерации кода. Это означает, что модель кода (которая является абстрактным синтаксическим деревом) отделена от фактического рендеринга кода (представление). Представления были обновлены и улучшены, так что теперь он выглядит лучше.

Защита контрольной суммы

Измененные вручную классы защищены контрольными суммами, поэтому они сохраняются, даже если мы решим изменить пространство имен.

Повышенная безопасность типов

Ускорение теперь может отображать столбцы, которые принимают значения из небольших наборов строк, в Enums, что еще больше повышает безопасность типов. Когда сгенерированный код использует Enum, любое несоответствие между моделью базы данных и значениями, используемыми в бизнес-логике, будет обнаружено компилятором как можно раньше, а не позднее в цикле разработки.

Улучшено ведение журнала для прозрачности

У Speedment есть новая система регистрации, которая позволяет нам видеть точный код SQL, отправляемый в базу данных. Это хорошо для прозрачности и позволяет нам точно видеть, что происходит под капотом. Мы можем легко включить ведение журнала всех операций CRUD следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
HaresApplication loggingApp = new HaresApplicationBuilder()
    .withPassword("secretDbPassword")
    .withLogging(STREAM)
    .withLogging(PERSIST)
    .withLogging(UPDATE)
    .withLogging(REMOVE)
    .build();
 
Manager<Hare> hares = loggingApp.getOrThrow(HareManager.class);
 
long oldHares = hares.stream()
    .filter(Hare.AGE.greaterThan(8))
    .count();
 
System.out.println("There are " + oldHares + " old hares");

Это создаст следующий журнал:

1
2
3
4
2016-10-19T20:50:21.957Z DEBUG [main] (#SELECT) -
    SELECT COUNT(*) FROM `hares`.`hare` WHERE (`hares`.`hare`.`age` > ?), values:[8]
 
There are 30 old hares

Улучшенный пользовательский интерфейс

Графический инструмент был улучшен во многих отношениях. Теперь мы получаем предупреждения и советы, которые дают нам лучшее руководство. Было добавлено несколько параметров конфигурации генератора кода, и мы также видим более релевантную информацию, когда выбираем разные объекты конфигурации.

New Maven Goals

Есть две новые цели Maven; «Очистить» и «перезагрузить», которые могут быть использованы для автоматизации и упрощения процесса строительства. Цель «очистить» удаляет весь сгенерированный код (который не был изменен вручную), а «перезагрузка» перезагружает модель домена непосредственно из существующей базы данных (метаданных).

Возьми это за спин

Посмотрите Speedment с открытым исходным кодом на GitHub, где также есть Wiki и краткое руководство . Не стесняйтесь оставлять отзывы и присоединяйтесь к обсуждению через Gitter .

Ездить безопасно!