【问题标题】:JPA Foreign Key Constraint Fails on EntityManager flushEntityManager 刷新时 JPA 外键约束失败
【发布时间】:2026-01-11 20:40:02
【问题描述】:

我一直在关注 NetBeans AffableBean 电子商务教程,但使用 IntelliJ 作为我的 IDE。我已经完成了所有工作,直到需要将客户添加到数据库中,以及与他们所下订单相关的 CustomerOrder。教程的部分在这里可见:

https://netbeans.org/kb/docs/javaee/ecommerce/transaction.html#placeOrder

当我下订单时,我收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`larrys`.`customer_order`, CONSTRAINT `fk_customer_order_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)

在此处刷新 EntityManager 时:

private void addOrderedItems(CustomerOrder order, ShoppingCart cart) {

    em.flush(); //Here

    List<ShoppingCartItem> items = cart.getItems();

    for (ShoppingCartItem scItem : items) {

        int productId = scItem.getProduct().getId();

        OrderedProductPK orderedProductPK = new OrderedProductPK();
        orderedProductPK.setCustomerOrderId(order.getId());
        orderedProductPK.setProductId(productId);

        OrderedProduct orderedItem = new OrderedProduct(orderedProductPK);

        orderedItem.setQuantity(scItem.getQuantity());

        em.persist(orderedItem);
    }
}

我的完整 OrderManager 代码在这里可见:

http://pastebin.com/jRintrTS

否则请更正我,但根据我对错误的理解,我试图在customer_order 表中插入一行但不能这样做,因为customer_id 的外键引用在@ 中不存在987654328@表。但是,我已经创建了客户并在订单之前将其持久化,所以我不明白为什么在尝试创建 CustomerOrder 之前它没有将数据提交到数据库。

这是netbeans为电商项目提供的schema sql:

https://netbeans.org/projects/samples/sources/samples-source-code/content/samples/javaee/AffableBean/setup/schemaCreation.sql

还有我的 persistence.xml 文件,与教程中提供的相同:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

    <persistence-unit name="LarrysPU" transaction-type="JTA">
        <jta-data-source>jdbc/larrys</jta-data-source>
        <properties/>
    </persistence-unit>
</persistence>

我的项目和 NetBeans 项目唯一不同的是,在我的customer 表中,我将cityRegion 更改为town,添加了postcodecounty,并且我的项目使用了不同的名称到 AffableBean。

有没有人知道我哪里出错了?

编辑 - 遇到错误时的 GlassFish 日志:

[2015-06-11T21:18:57.799+0100] [glassfish 4.1] [FINE] [] [org.eclipse.persistence.session.file:/OBFUSCATED/Larrys/out/artifacts/Larrys/WEB-INF/classes/_LarrysPU.sql] [tid: _ThreadID=26 _ThreadName=http-listener-1(2)] [timeMillis: 1434053937799] [levelValue: 500] [[
  INSERT INTO larrys.customer (id, address, cc_number, county, email, name, phone, postcode, town) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
    bind => [9 parameters bound]]]

[2015-06-11T21:18:57.800+0100] [glassfish 4.1] [FINEST] [] [org.eclipse.persistence.session.file:/OBFUSCATED/Larrys/out/artifacts/Larrys/WEB-INF/classes/_LarrysPU.query] [tid: _ThreadID=26 _ThreadName=http-listener-1(2)] [timeMillis: 1434053937800] [levelValue: 300] [[
  Execute query InsertObjectQuery(entity.CustomerOrder@1f3cec0)]]

[2015-06-11T21:18:57.801+0100] [glassfish 4.1] [FINE] [] [org.eclipse.persistence.session.file:/OBFUSCATED/Larrys/out/artifacts/Larrys/WEB-INF/classes/_LarrysPU.sql] [tid: _ThreadID=26 _ThreadName=http-listener-1(2)] [timeMillis: 1434053937801] [levelValue: 500] [[
  INSERT INTO larrys.customer_order (id, amount, confirmation_number, date_created, customer_id) VALUES (?, ?, ?, ?, ?)
    bind => [5 parameters bound]]]

[2015-06-11T21:18:57.802+0100] [glassfish 4.1] [FINE] [] [org.eclipse.persistence.session.file:/OBFUSCATED/Larrys/out/artifacts/Larrys/WEB-INF/classes/_LarrysPU.sql] [tid: _ThreadID=26 _ThreadName=http-listener-1(2)] [timeMillis: 1434053937802] [levelValue: 500] [[
  SELECT 1]]

[2015-06-11T21:18:57.802+0100] [glassfish 4.1] [WARNING] [] [org.eclipse.persistence.session.file:/OBFUSCATED/Larrys/out/artifacts/Larrys/WEB-INF/classes/_LarrysPU] [tid: _ThreadID=26 _ThreadName=http-listener-1(2)] [timeMillis: 1434053937802] [levelValue: 900] [[

Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`larrys`.`customer_order`, CONSTRAINT `fk_customer_order_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
Error Code: 1452

【问题讨论】:

    标签: java mysql jpa intellij-idea


    【解决方案1】:

    原来我遇到的问题是因为我的 Id 访问器没有@GeneratedValue(strategy = GenerationType.IDENTITY),所以我为每个实体添加了这个。

    至于修复我收到的Unknown column 'SOMETHING' in 'field list' 错误,事实证明我只收到了 OrderedProduct 类的这个错误。我没有在字段上使用@Annotations,而是选择在它们的访问器方法上使用它们,这可以在将来允许自定义;但我忘记了这一点:

    @EmbeddedId
    protected OrderedProductPK orderedProductPK;
    

    @EmbeddedId 注释应该出现在 OrderedProductPK 的访问器上。

    【讨论】:

      【解决方案2】:

      我猜 OrderedProduct 上有一个 customerId 属性,您需要使用有效的客户 ID 或有效的客户对象调用 orderedItem.setCustomerId() 或 orderedItem.setCustomer(),具体取决于您创建实体类的方式。这些似乎是在orderedItem 对象上设置值的仅有的两行。

      // order id
      orderedProductPK.setCustomerOrderId(order.getId());
      // product id
      orderedProductPK.setProductId(productId);
      // object created with order and product associations
      OrderedProduct orderedItem = new OrderedProduct(orderedProductPK);
      // quantity set
      orderedItem.setQuantity(scItem.getQuantity());
      // customer is not associated
      

      客户需要与orderedItem 相关联。

      编辑: 查看教程,看起来客户与订单对象相关联。 order.getCustomer() 你得到了什么?如果它为空,那是你的问题。

      【讨论】:

      • 在调用addOrderedItems方法之前,我还要调用addCustomeraddOrder。 OrderManager 的完整代码在这里可见 - pastebin.com/jRintrTS - 在到达 orderedItem 行之前,错误发生在 em.flush();
      • order.getCustomer() 不返回 null,它返回分配给订单的 Customer 对象。
      • 我猜不是这样,抱歉。你能做 order.getCustomer().getId() 吗?客户是否作为同一事务的一部分持续存在?如果是,如果您尝试先坚持客户会发生什么?如果没有,您可以直接查询数据库以确保客户记录在那里吗?这可能会有所帮助:*.com/questions/10769865/…
      • 我刚刚解决了这个问题 - 结果是,我忘记在我的实体中添加 @GeneratedValue(strategy = GenerationType.IDENTITY) 注释。但是,我遇到了一个新问题。执行 SQL 查询时,出现一堆错误:Unknown column 'PRODUCTID' in 'field list' - 显然这与命名策略有关,并且似乎忽略了我的 @Column 注释。有什么线索吗?
      最近更新 更多