java - JPA 外键约束在 EntityManager 刷新时失败

标签 java mysql jpa intellij-idea

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

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 的外键引用customer 表中不存在 。但是,我已经创建了客户并在订单之前将其保留,因此我不明白为什么它在尝试创建 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

最佳答案

事实证明,我遇到的问题是由于我的 Id 访问器没有 @GenerateValue(strategy = GenerationType.IDENTITY) 引起的,因此我为每个实体添加了这个。

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

@EmbeddedId
protected OrderedProductPK orderedProductPK;

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

关于java - JPA 外键约束在 EntityManager 刷新时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30790090/

相关文章:

java - Java中ArrayList的内存大小是多少

java - LinkedList(通用)中的删除方法有什么问题?

Java 请求文件、发送文件(Client-server)

MySQL 自定义 order by 子句

google-app-engine - google app engine java datastore是否缓存JPA查询结果?

java - 用于在高负载(500kb 及以上)下对 Http 请求进行负载测试的工具

mysql - sql count (including null) from table where 两个条件

mysql - CakePHP - 生成的查询无法与 SQL Server 一起正常工作

java - 如何防止使用 Hibernate 的 Java 应用程序丢失更新?

java - OSGI - 将实体拆分为多个包