【问题标题】:Cannot add or update a child row: a foreign key constraint fails in hibernate无法添加或更新子行:外键约束在休眠中失败
【发布时间】:2016-10-17 14:52:55
【问题描述】:

我正在使用 JPA、Hibernate 和 MySQL

我得到以下异常

无法添加或更新子行:外键约束失败

@Entity
@Table(name = "my_payment_request")
public class Request implements Serializable {
     private static final long serialVersionUID = 1L;

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;

     @OneToMany(mappedBy = "request",cascade=CascadeType.ALL)
     private List<PaymentItem> paymentItems;

}

@Entity
@Table(name = "my_payment_item")
public class PaymentItem {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne
    @JoinColumn(name = "request_id", nullable=true)
    private Request request;

}

public class Manager {
Request request = new Request();
    List<PaymentItem> paymentItems = new ArrayList<PaymentItem>();
        PaymentItem paymentItem1 = new PaymentItem();
        paymentItem1.setRequest(request);
        PaymentItem paymentItem2 = new PaymentItem();
        paymentItem2.setRequest(request);
        paymentItems.add(paymentItem1);
        paymentItems.add(paymentItem2);
        request.setPaymentItems(paymentItems);

}

休眠代码

Session session = sessionFactory.openSession();
        session.beginTransaction();

        request.setId((Long) session.save(request));
        session.getTransaction().commit();

【问题讨论】:

  • 你能解释一下你想用request.setId((Long) session.save(request))做什么吗?
  • 我没有看到你有request.setPaymentItems(paymentItems);
  • @guido 我忘了把那一行放在这个问题中,但它在我的实际代码中
  • 您试图在外键中保存一个值,该值在其引用的主键字段中不存在..
  • @ankit 在这种情况下,我想您需要先保存两个 paymentItems,然后再保存 setRequest(request),然后才能保存请求。

标签: java mysql hibernate jpa


【解决方案1】:

通过在插入命令之前添加这个来关闭它:

SET foreign_key_checks = 0;

然后在插入后将其重新设置:

SET foreign_key_checks = 1;

只要确保你知道自己在做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多