Как вставить неизменяемую запись, используя spring-data-jdbc - PullRequest
0 голосов
/ 02 мая 2020

Сущность:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

import java.util.UUID;

@Table
public record Picture(
        @Id UUID id,
        UUID galleryId,
        String metadata
) { }

Обратите внимание, что идентификатор - это UUID, назначенный на стороне клиента, поэтому меня не интересуют какие-либо идентификаторы, автоматически назначаемые базой данных.

Репозиторий :

import org.springframework.data.repository.CrudRepository;

public interface PictureRepository extends CrudRepository<Picture, String>, WithInsert<Picture> {
}
public interface WithInsert<T> {
    T insert(T t);
}
import org.springframework.data.jdbc.core.JdbcAggregateTemplate;

public class WithInsertImpl<T> implements WithInsert<T> {

    private final JdbcAggregateTemplate template;

    public WithInsertImpl(JdbcAggregateTemplate template) {
        this.template = template;
    }

    @Override
    public T insert(T t) {
        return template.insert(t);
    }
}

когда я вызываю repository.insert(picture) Я получаю следующую ошибку:

 java.lang.UnsupportedOperationException: Cannot set immutable property [...package redacted away...].Picture.id!
    at org.springframework.data.mapping.model.BeanWrapper.setProperty(BeanWrapper.java:86) ~[spring-data-commons-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
    at org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:61) ~[spring-data-commons-2.2.6.RELEASE.jar!/:2.2.6.RELEASE]
    at org.springframework.data.relational.core.conversion.AggregateChange.setIdAndCascadingProperties(AggregateChange.java:177) ~[spring-data-relational-1.1.6.RELEASE.jar!/:1.1.6.RELEASE]
    at org.springframework.data.relational.core.conversion.AggregateChange.populateIdsIfNecessary(AggregateChange.java:144) ~[spring-data-relational-1.1.6.RELEASE.jar!/:1.1.6.RELEASE]

Вопрос: есть ли способ использовать неизменяемый Сущность с spring-data-jdb c?

Rant: неизменность хорошая, UUID хорошие, автоинкремент плохой. Я думаю, это довольно предположение, что я обязательно хочу автоинкремент, и я хотел бы иметь возможность отключить его в случае, если я не хочу его.

РЕДАКТИРОВАТЬ: я использую spring-boot- starter-jdb c: 2.2.6.RELEASE, которая поставляется с spring-data-jdb c: 1.1.6.RELEASE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...