MySQLIntegrityConstraintViolationException:列'id'不能为null

时间:2017-06-02 11:54:26

标签: java hibernate spring-boot one-to-many

我正在使用与hibernate和spring boot之间的一对多关系,我收到此错误

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

我的实体课程

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);
    }
}

我是否正确使用注释?

2 个答案:

答案 0 :(得分:0)

@Column(名称=&#34; INVOICE_ID&#34) 将其重命名为@Column(name =&#34; id&#34;)或将其删除。

答案 1 :(得分:0)

这里的产品表有一个来自发票的外键引用,它不是空的,你正在保存没有发票引用的产品,所以你得到 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'invoice_id' cannot be null

SO 在保存产品时,您也需要映射 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);
    }
}