在Spring Boot中更新OneToMany关系时出错

时间:2020-04-06 07:20:49

标签: java spring hibernate spring-boot jpa

我正在使用Spring Boot 2和JPA / Hibernate。

我有2个实体:

  1. ItemDetails
package com.app.shop.entity;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;

@Getter
@Setter
@Entity
@Table(name = "item_mst")
@Cacheable
public class ItemDetails {

    @Id
    @Column(name = "item_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "native")
    private int itemId;
    @Column(name = "item_name", nullable = false)
    private String itemName;
    private char status;
    private String description;
    @OneToMany(mappedBy = "itemDetails")
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.PERSIST})
    private List<ItemPackingDetails> itemPackingDetails;
    @Column(name = "customer_allowed")
    private String customerAllowed;
    @ManyToMany(mappedBy = "itemDetails")
    private Set<Category> categories;
    String image;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ItemDetails that = (ItemDetails) o;
        return itemId == that.itemId &&
                status == that.status &&
                Objects.equals(itemName, that.itemName);
    }


    @Override
    public String toString() {
        return "ItemDetails{" +
                "itemId=" + itemId +
                ", itemName='" + itemName + '\'' +
                ", status=" + status +
                ", description='" + description + '\'' +
                ", itemPackingDetails=" + itemPackingDetails +
                ", customerAllowed='" + customerAllowed + '\'' +
                ", categories=" + categories +
                ", image='" + image + '\'' +
                '}';
    }
}
  1. ItemPackingDetails
package com.app.shop.entity;


import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import javax.persistence.*;

@Getter
@Setter
@Entity
@Table(name = "packing_details")
public class ItemPackingDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "native")
    private int id;
    private int size;
    private char status;
    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "item_id")
    private ItemDetails itemDetails;

}

我编写了一个函数,将新的ItemPackingDetails对象添加到数据库中已存在的ItemDetails对象。我正在使用PostgreSQL。

public HashMap<String, Object> addPacking(ItemDetails itemDetails){
        returnObject = new HashMap<>();
        Optional<ItemDetails> optional = productManagementRepository.findById(itemDetails.getItemId());
        ItemDetails foundItemDetails = null;
        if (optional.isPresent()){
            foundItemDetails = optional.get();
        }
        if (foundItemDetails!=null){
            for (ItemPackingDetails itemPackingDetails : itemDetails.getItemPackingDetails()) {
                itemPackingDetails.setStatus('y');
                itemPackingDetails.setItemDetails(foundItemDetails);
                foundItemDetails.getItemPackingDetails().add(itemPackingDetails);
                logger.error("Packing Details: " + itemPackingDetails.getSize() + " " + itemPackingDetails.getStatus() + " " + itemPackingDetails.getItemDetails().getItemId());
            }
            productManagementRepository.save(foundItemDetails);
            returnObject.put("message", "success");
        }
        else
            returnObject.put("message", "failure" + itemDetails.getItemId());
        return returnObject;
    }

我收到以下错误:org.postgresql.util.PSQLException:错误:编码“ UTF8”的字节序列无效:0x00 在运行查询insert into packing_details (item_id, size, status, id) values (?, ?, ?, ?)

请提供帮助,因为我没有将任何null值传递给该对象。在控制台日志记录中,我可以在ItemPackingDetails对象中正确看到所有值。

0 个答案:

没有答案