【问题标题】:Hibernate Relationship : Column 'purchaseId' cannot be null休眠关系:列“purchaseId”不能为空
【发布时间】:2019-11-28 04:08:42
【问题描述】:

我与 PurchaseDetails 有 OneToMany 关系。 Purchase Entity 有基本的详细信息,PurchaseDetails 有一个已购买项目的列表。我想要实现的是在将数据保存到购买项目的购买表(父)列表时,也会自动保存在 PurchaseDetail 表(子)中。

2019-07-19 13:05:53.581 警告 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:1048,SQLState: 23000 2019-07-19 13:05:53.581 错误 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper:列“purchaseId”不能 为空

Purchase.java

@Entity
@Table(name = "purchase")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Purchase {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name = "purchaseId")
    private BigInteger purchaseId;

    @ManyToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name="accountId", nullable = false)
    private Account account;

    @JsonBackReference
    @OneToMany(mappedBy="purchase",fetch=FetchType.LAZY,cascade = CascadeType.PERSIST)
    private List<PurchaseDetails> purchaseDetails = new ArrayList<PurchaseDetails>();

    private Date purchaseDate;
    private String name;
    private String address;
    private String whatsapp;
    private String payStatus;
    private int creditDays;
    private Float loading;
    private BigInteger purchaseAmount;
    private BigInteger receivedAmount;
    private String remarks;
    private Date creation;
    private Date lastedit;
    private Boolean isDeleted;

    @PrePersist
    protected void onCreate() {
        creation  = new Date();
        lastedit = new Date();
        isDeleted = false;
    }

}

PurchaseDetails.java

@Entity
@Table(name = "purchaseDetails")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PurchaseDetails {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private BigInteger purchaseDetailId;

    @ManyToOne(fetch = FetchType.LAZY, targetEntity = Purchase.class)
    @JoinColumn(name="purchaseId", referencedColumnName = "purchaseId", nullable = false)
//  @MapsId(value = "purchaseId")
    private Purchase purchase;

    @OneToOne(cascade = CascadeType.MERGE)
    @JoinColumn(name = "itemId", nullable = false)
    private Item item;

    private Float quantity;
    private Float rate;
    private Float rateGST;
    private Float subTotal;
    private Float subTotalGST;
    private Date creation;
    private Date lastedit;
    private Boolean isDeleted;

    @PrePersist
    protected void onCreate() {
        creation  = new Date();
        lastedit = new Date();
        isDeleted = false;
    }

}

PurchaseService.java

@Service
public class PurchaseService {

    @Autowired PurchaseRepository purchaseRepository;

    public boolean newPurchase(Purchase purchase, StringResponseDTO response)
    {
        if(isValidPurchaseData(purchase))
        {
            System.out.println("Service: "+purchase.toString());
            purchase.setPurchaseDetails(purchase.getPurchaseDetails());
            purchaseRepository.save(purchase);
            response.setMessage("Purchase of "+ purchase.getName() + " is added successfuly");
            return true;
    }
        else
        {
            response.setMessage("Please Provide Valid Data");
            return false;
        }
    }
}

来自 Postman 的输入 JSON (值仅用于测试,因此请忽略 subTotal 等)

{
    "purchaseDate":"2019-07-18T08:37:41.000+0000",
    "name":"PersonName",
    "address":"Besides xyz Hotel, NH - 5, India",
    "whatsapp":"1234567899",
    "payStatus":"Paid",
    "creditDays":"0",
    "purchaseAmount":"2600",
    "receivedAmount":"2600",
    "loading":"100",
    "remarks":"Not Any",
    "purchaseDetails":[
        {

            "quantity":"523.6",
            "rate":"67",
            "rateGST":"70",
            "subTotal":"35081",
            "subTotalGST":"36652",
            "item":{
                "itemId":"14"
            }
        },
        {
            "quantity":"222.6",
            "rate":"67",
            "rateGST":"70",
            "subTotal":"35081",
            "subTotalGST":"36652",
            "item":{
                "itemId":"16"
            }
        }],
    "account":{
        "accountId":"4"
    }
}

【问题讨论】:

  • purchaseId上尝试@GeneratedValue(strategy = GenerationType.AUTO)

标签: java spring hibernate spring-boot foreign-keys


【解决方案1】:

您创建了与父母和孩子的双向关系。如果您想通过级联保存父级及其子级,您还需要在您的子级上设置父级,否则您将遇到错误。请尝试:

for (PurchaseDetail purchaseDetail : purchase.getPurchaseDetails()) {
    purchaseDetail.setPurchase(purchase);
}
purchase.setPurchaseDetails(purchase.getPurchaseDetails());
purchaseRepository.save(purchase);

【讨论】:

    【解决方案2】:

    您在 Purchase 和 PurchaseDetails 之间有很多关系,那么您应该在 PurchaseDetails 中传递 Purchase id 来建立关系,因此:
    1.在服务层你应该先添加购买而不设置PurchaseDetails
    2. 添加与步骤 1 中添加的相同 Purchase 的所有 PurchaseDetails。

    @Service
    public class PurchaseService {
    
    @Autowired 
    PurchaseRepository purchaseRepository;
    
    
    @Autowired 
    PurchaseDetailsRepository purchaseDetailsRepository;
    
    
    public boolean newPurchase(Purchase purchase, StringResponseDTO response)
    {
        if(!isValidPurchaseData(purchase))
        {
            System.out.println("Service: "+purchase.toString());
           //yo should have all PurchaseDetails in a list pay attention this list not null
           List<PurchaseDetails> purchaseDetails=purchase.getPurchaseDetails();
           //step 1
            purchase=purchaseRepository.save(purchase);
            response.setMessage("Purchase of "+ purchase.getName() + " is added successfuly");
            for(PurchaseDetails adddetail:purchaseDetails){
                //step 2
                adddetail.setPurchase(purchase);
                purchaseDetailsRepository.save(adddetail);
            }
            return true;
    }
        else
        {
            response.setMessage("Please Provide Valid Data");
            return false;
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2016-01-08
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多