Автоинкремент JPA не обновляется, если уже вставлены данные с таким же идентификатором - PullRequest
0 голосов
/ 29 января 2020

У меня есть классы Category с автоматическим приращением

@Id //The unique id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(unique = true)
private String name;

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, mappedBy="category", orphanRemoval = false)
@Column(nullable = true)
private List<SubCategory> subCategoryList = new ArrayList<>();

public Category(String categoryname) {
    this.name = categoryname;
}

И подкатегория

@Id //The unique id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column
private String name;

@JsonIgnore
@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name="category_id")
Category category;

/**
 * @param name
 */
public SubCategory(String name) {
    super();
    this.name = name;
}

У меня также есть данные файла. sql в моем пути к классам. Этот файл загружается, когда я запускаю мое приложение весенней загрузки, чтобы вставить значения по умолчанию

--insert default category
INSERT INTO public.category(id, name)   VALUES (1, 'Webtoon');
INSERT INTO public.category(id, name)   VALUES (2, 'Ebook');
INSERT INTO public.category(id, name)   VALUES (3, 'Education');

--insert sub category
INSERT INTO public.sub_category(id, name, category_id)  VALUES (1, 'Action', 1);
INSERT INTO public.sub_category(id, name, category_id)  VALUES (2, 'Adventure', 1);
INSERT INTO public.sub_category(id, name, category_id)  VALUES (3, 'Thriller', 1);

После запуска приложения, когда я вызываю службу для создания другой подкатегории, я получил исключение публикации Id

    Optional<Category> categoryOpt =  categoryService.findById(Long.parseLong("1"));
    Assert.assertTrue("The category mus be present",categoryOpt.isPresent()); //The data with id 1 is found
    Assert.assertNotNull("The category must not be null. It should be loaded from ressources", categoryOpt.get().getId());

    //Spring generate id  instead of getting the correct sequence in database
    Category category = new Category("My-Category-Test");
    category = categoryService.create(category);

    Assert.assertNotNull("Category id must not be null", category.getId());

Вместо получения правильной последовательности из базы данных Spring генерирует свою собственную последовательность с уже существующими данными. поэтому я получил это исключение:

2020-01-29 01: 00: 02.848 TRACE 9148 --- [nio-9103-exe c -1] ohtype.descriptor. sql. BasicBinder: параметр привязки [1] как [BIGINT] - [1] 2020-01-29 01: 00: 02.849 TRACE 9148 --- [nio-9103-exe c -1] ohtype.descriptor. sql. BasicBinder: параметр привязки [2] как [VARCHAR] - [My-Category-Test] 2020-01-29 01: 00: 02.860 WARN 9148 --- [nio-9103-exe c -1] ohengine.jdb c .spi.SqlExceptionHelper: SQL Ошибка: 0, SQLState: 23505 2020-01-29 01: 00: 02.860 ОШИБКА 9148 --- [nio-9103-exe c -1] ohengine.jdb c .spi.SqlExceptionHelper: ERREUR: значение дублирующего ключа нарушает уникальное ограничение «sub_category_pkey»

Как я могу сообщить JPA, что найдена правильная последовательность?

1 Ответ

0 голосов
/ 29 января 2020

Я нашел решение. Если идентификатор жестко добавлен, автоматическое увеличение не используется, поэтому в спящем режиме по-прежнему указывают на 1, например, даже если 1 уже вставлен вручную.

Поэтому я изменяю свой сценарий на использование автоматического увеличения, как это

--insert default category
INSERT INTO public.category(name)   VALUES ('Webtoon');
INSERT INTO public.category(name)   VALUES ('Ebook');
INSERT INTO public.category(name)   VALUES ('Education');

--insert sub category
INSERT INTO public.sub_category(name, category_id) SELECT 'Action', id FROM public.category where public.category.name = 'Webtoon';
INSERT INTO public.sub_category(name, category_id) SELECT 'Adventure', id FROM public.category where public.category.name = 'Webtoon';
INSERT INTO public.sub_category(name, category_id) SELECT 'Thriller', id FROM public.category where public.category.name = 'Webtoon';

При этом автоинкремент используется базой данных и hibernate

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