java - hibernate 关系: Column 'purchaseId' cannot be null

标签 java spring hibernate spring-boot foreign-keys

我有购买到购买详细信息的一对多关系。购买实体具有基本详细信息,购买详细信息将具有所购买商品的列表。我想要实现的是,当将数据保存到购买表(父)中时,所购买商品的列表也会自动保存在购买详细表(子)中。

2019-07-19 13:05:53.581 WARN 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000 2019-07-19 13:05:53.581 ERROR 8868 --- [nio-8060-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'purchaseId' cannot be null

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"
    }
}

最佳答案

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

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

关于java - hibernate 关系: Column 'purchaseId' cannot be null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57107787/

相关文章:

java - 本地主机上的服务器 Tomcat v7.0 服务器无法在 45 秒内启动。如果服务器需要更多时间,

java - 登录表单用户凭据而不是 LDAP Spring Security 中的硬编码 UserDn 和密码

java - 如何在 Spring Boot 中创建无限期返回的请求

hibernate - Spring 3/Hibernate - 在运行时执行数据库转储

java - Hibernate:如果字段存在某个值,则无法更新为新值

java - 如何导出和导入彼此依赖的app-docker和mysql-docker?

java - 访问具有名称的文件的正确方法

java - 如何使用注释在 @Scope ("prototype") bean 中指定实例特定的 @Value?

java - 使用Maven部署Spring-Boot项目并进一步导入到其他项目中

java - Hibernate 找不到正确的外键