У меня есть классы 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, что найдена правильная последовательность?