Hibernate сохранить объект с данными, касающимися «родителя» - PullRequest
0 голосов
/ 28 октября 2019

Я отправляю объект JSON, чтобы сохранить его в базе данных. Я считаю, что категория уже существует и не может быть изменена (например, значения устанавливаются с помощью раскрывающегося списка).

{
    "productKeyId": "W7cpgwmb8LOkE7u5vRZLVoY8mXWmnR",
    "name": "Pizzaé miam miam",
    "price": 344.0,
    "qty": 15,
    "imgPath": "new/pathImage",
    "category": {
        "categoryKeyId": "VMz7EM6tNfoOAQtO1SHPYcH14jj0Cy",
        "name": "Fish"
    }
}

Для создания этого json я создал два класса моделей:

@Getter @Setter
public class ProductCreateRequestModel {
    private String productKeyId;
    private String name;
    private double price;
    private int qty;
    private String imgPath;

    private CategoryRequestCreateProductModel category;
}

И:

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

В моем контроллере:

public ProductRest createProduct(@RequestBody ProductCreateRequestModel productRequestModel) throws Exception {
    ProductRest returnValue = new ProductRest();

    CategoryRequestCreateProductModel categoryRequestCreateProductModel = new CategoryRequestCreateProductModel();
    //CategoryRest categoryRest = new CategoryRest();

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

    if(productRequestModel.getName().isEmpty() || productRequestModel.getPrice() <= 0 || productRequestModel.getCategory() == null)
        throw new ApplicationServiceException(ErrorMessages.MISSING_REQUIRED_FIELDS.getErrorMessage());

    ProductDto productDto = new ProductDto();
    productDto.setCategory(categoryDto);
    productDto = modelMapper.map(productRequestModel, ProductDto.class);

    ProductDto createdProduct = productService.createProduct(productDto);
    returnValue = modelMapper.map(createdProduct, ProductRest.class);

    return returnValue;
}

Наконец, на моем слое обслуживания:

@Override
public ProductDto createProduct(ProductDto productDto) {
    if ( productRepository.findByName(productDto.getName()) != null)
        throw new ApplicationServiceException("Record already in Database");

    CategoryDto categoryDto = productDto.getCategory();
    productDto.setCategory(categoryDto);

    ModelMapper modelMapper = new ModelMapper();
    ProductEntity productEntity = modelMapper.map(productDto, ProductEntity.class);
    String productKeyId = utils.generateProductKeyId(30);
    productEntity.setProductKeyId(productKeyId);

    ProductEntity storedProduct = productRepository.save(productEntity);

    return modelMapper.map(storedProduct, ProductDto.class);
}

Мой слой ProductDto:

private Long id;
private String name;
private String productKeyId;
private double price;
private int availableQty;
private String imgPath;

private CategoryDto category = new CategoryDto();

Моя категорияDto:

private long id;
private String categoryKeyId;
private String name;

private CategoryDto parentCategory;
private List<CategoryDto> subCategories;

private String parentCategoryKeyId;

private Long parentCategoryId;

Наконец, мой productEntity

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

@Column(nullable = false)
private String productKeyId;

// many to one relationship with category
@ManyToOne
@JoinColumn(name = "category_id")
private CategoryEntity category;

@Column(nullable = false)
private String name;

@Column(nullable = false)
private double price;

@Column(nullable = false)
private int availableQty;

private String imgPath;

И мой CategoryEntity

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

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

@Column(nullable = false)
private String name;

@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name="parent_id", nullable=true)
private CategoryEntity parentCategory;

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


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

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

1) Converter org.modelmapper.internal.converter.NumberConverter@57364b9e failed to convert java.lang.String to long.

1 error] with root cause

java.lang.NumberFormatException: For input string: "VMz7EM6tNfoOAQtO1SHPYcH14jj0Cy"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:na]
    at java.base/java.lang.Long.parseLong(Long.java:692) ~[na:na]
    at java.base/java.lang.Long.valueOf(Long.java:1144) ~[na:na]

1 Ответ

1 голос
/ 28 октября 2019

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

public ProductRest createProduct(@RequestBody ProductCreateRequestModel productRequestModel) throws Exception {
    ProductRest returnValue = new ProductRest();

    CategoryRequestCreateProductModel categoryRequestCreateProductMode = modelMapper.map(productRequestModel.getCategory(), CategoryRequestCreateProductModel.class);

    CategoryDTO categoryDTO = new CategoryDTO();
    categoryDTO.setCategoryKeyId(categoryRequestCreateProductMode.getCategoryKeyId());
    categoryDTO.setName(categoryRequestCreateProductMode.getName());

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