EntityManager flush上的JPA外键约束失败

时间:2015-06-11 19:47:14

标签: java mysql jpa intellij-idea

我一直在关注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的外键引用不能这样做存在于customer表中。但是,我创建了客户并在订单之前保留了它,所以我不明白为什么在尝试创建CustomerOrder之前没有将数据提交到数据库。

这是netbeans为电子商务项目提供的架构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,添加了postcode和{{1我的项目使用了与AffableBean不同的名称。

有没有人对我可能出错的地方有任何想法?

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

county

2 个答案:

答案 0 :(得分:1)

事实证明我遇到的问题是由于我的Id访问者没有@GeneratedValue(strategy = GenerationType.IDENTITY),所以我为每个实体添加了这个。

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

@EmbeddedId
protected OrderedProductPK orderedProductPK;

其中@EmbeddedId注释应存在于OrderedProductPK的访问者中。

答案 1 :(得分:0)

我猜测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()有什么看法?如果它为null,那就是你的问题。