MySQLIntegrityConstraintViolationException:Column 'id' 不能为空

MySQLIntegrityConstraintViolationException:Column 'id' cannot be null

我正在使用与休眠和 spring 引导的一对多关系,但出现此错误

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 列 'invoice_id' 不能为空

我的实体类

Invoice.java

@Entity
@Table
public class Invoice {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="invoice_id")
    private int id;

    @OneToMany(mappedBy = "invoice")
    private List<Product> products;
}

Product.java

@Entity
@Table
public class Product {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column
    private int product_id;

    @ManyToOne
    @JoinColumn(name="invoice_id")
    private Invoice invoice;
}

为了创建发票,我需要创建产品,所以当我尝试保存产品时出现错误

ProductService.java

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public void saveProduct(Product product){
        product.setDate(new Date());
        product.setStatus("Active");
        productRepository.save(product);
    }
}

我使用注释的方式是否正确?

@Column(name="invoice_id")

要么重命名为

@Column(name="id")

或删除它。

这里的产品 Table 有一个来自 Invoice 的外键引用,它不为空,并且您正在保存没有 Invoice 引用的 Product,因此您得到 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'invoice_id' 不能为空

所以在保存产品时你也需要映射 invoice_id。

我在下面的代码片段中提供了正确的方法

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Autowired
    private InvoiceRepository invoiceRepository;

    public void saveInvoiceAndProduct(){
        //either get the existing Invoice Data from db or save new one
        Invoice invoice = new Invoice();
        List<Product> prods = new ArrayList<>();

        Product product = new Product();
        product.setDate(new Date());
        product.setStatus("Active");
        prods.add(product);
        invoice.setProducts(prods);
        invoiceRepository.save(invoice);
        product.setInvoice(invoice);
        //linked Product with the invoice_id before saving it
        productRepository.save(product);
    }
}