Spring boot Rest создает категорию, которая может ссылаться на другую категорию или нет - PullRequest
0 голосов
/ 21 октября 2019

У меня есть класс сущностей

public class CategoryEntity implements Serializable {
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    @Column(length = 30, nullable = false)
    private String categoryKeyId;

    @Column(nullable = false)
    private String name;

    //Here mappedBy indicates that the owner is in the other side
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "category", cascade = CascadeType.ALL)
    private List<ProductEntity> products;

    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    private CategoryEntity parent;

    // allow to delete also subcategories
    @OneToMany(mappedBy="parent", cascade = CascadeType.ALL)
    private List<CategoryEntity> subCategories;
}

, этот класс генерирует этот код SQL:

CREATE TABLE `categories` (
  `id` bigint(20) NOT NULL,
  `category_key_id` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `parent_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKsaok720gsu4u2wrgbk10b5n8d` (`parent_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Пока все хорошо, что я отличноожидая. Моя проблема касается того, как создать новую категорию.

Мой слой DTO:

@Getter @Setter
public class CategoryDto implements Serializable {
    @Getter(AccessLevel.NONE)
    @Setter(AccessLevel.NONE)
    private static final long serialVersionUID = 1L;

    private long id;
    private int parentCategoryId;
    private String categoryKeyId;
    private String name;
    private List<CategoryDto> subCategories;
    private CategoryDto parentCategory;

}

Я также создал 2 модели отдыха для создания категории один для запроса идругой для ответа. Мне нужно предоставить json в качестве записи с именем и идентификатором родительской категории:

@Getter @Setter
public class CategoryCreateRequestModel {
    private String name;
    private int parentCategory;
}

И я получаю json как вывод:

@Getter @Setter
public class CategoryCreateRest {
    private String categoryKeyId;
    private String name;
    private CategoryCreateRest parentCategory;
}

Мой метод createCategory возвращает ожидаемый результат вывода и принимает в качестве входных данных CategoryCreateRequestModel.

@PostMapping(
        consumes = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE },
        produces = { MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE }
) 
public CategoryCreateRest createCategory(@RequestBody CategoryCreateRequestModel categoryCreateRest) throws Exception {
    CategoryCreateRest returnValue = new CategoryCreateRest();

    if( categoryCreateRest.getName().isEmpty())
        throw new NullPointerException(ErrorMessages.MISSING_REQUIRED_FIELDS.getErrorMessage());

    ModelMapper modelMapper = new ModelMapper();
    CategoryDto categoryDto = modelMapper.map(categoryCreateRest, CategoryDto.class);

    CategoryDto createdCategory = categoryService.createCategory(categoryDto);
    returnValue = modelMapper.map(createdCategory, CategoryCreateRest.class);

    return returnValue;
}

Мой уровень обслуживания:

@Override
public CategoryDto createCategory(CategoryDto categoryDto) {
    // check if category name and parentId are identicals
    if (categoryRepository.findByName(categoryDto.getName()) != null)
        throw new ApplicationServiceException("Record already in Database");

    ModelMapper modelMapper = new ModelMapper();
    CategoryEntity categoryEntity = modelMapper.map(categoryDto, CategoryEntity.class);

    // generate categoryKeyId
    String categoryKeyId = utils.generateCategoryKeyId(30);
    categoryEntity.setCategoryKeyId(categoryKeyId);

    CategoryEntity storedCategory = categoryRepository.save(categoryEntity);

    CategoryDto returnValue = modelMapper.map(storedCategory, CategoryDto.class);

    return returnValue;
}

Когда я устанавливаю новую категорию, например:

{
  "name": "catName",
  "parentCategoryId": 12
}

или

{
  "name": "catName",
  "parentCategoryId": null
}

Я получаю сообщение об ошибке 500: не удалось выполнить оператор;SQL [н / п];ограничение [ПЕРВИЧНОЕ];вложенное исключение - org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию "

Очевидно, у меня проблемы с первичным ключом, и я не вижу, что происходит не так. Мне не нужно передавать идентификатор дляэтот json, потому что он должен генерироваться автоматически.

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