SELECT查询使用JPAContainerFactory创建的实体管理器创建INSERT INTO查询



我有下面的订单表。(为了可读性,我删除了大部分列(

CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`surprice_id` varchar(60) NOT NULL,
`customer_id` int(11) DEFAULT NULL,
`car_group_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_orders_car_group` FOREIGN KEY (`car_group_id`) REFERENCES `car_group` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_orders_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
);

我有一个同步方法,在那里我得到一个订单的外部列表,并对它们进行迭代;surprice_id";看看这个订单是否已经在我的系统中了
这是我使用的查询

List<Orders> orders = em.createNativeQuery("SELECT * FROM orders WHERE surprice_id = '" + surpriceId + "'", Orders.class).getResultList();

这是我使用的实体经理

EntityManager em = JPAContainerFactory.createEntityManagerForPersistenceUnit("pu");

"PU";是我在Persistence.xml 中声明的持久性单元的名称

如果查询后列表的大小为0,则我将其添加到系统中,否则我将更新详细信息
由于某种原因,在特定的surprice_id下,查询会返回一个异常。

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'car_group_id' cannot be null
Error Code: 1048
Call: INSERT INTO orders (broker_code, collection_address, collection_message, creation_date, delivery_address, delivery_message, departure_airport, end_actual, end_date, ext_end_date, ext_start_date, extra_data, flight_number, notes, sold_as_upgrade, start_actual, start_date, status, surprice_id, version, area_from_id, area_to_id, broker_id, car_group_id, customer_id, first_driver_id, second_driver_id, staff_collection_id, staff_delivery_id, station_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [30 parameters bound]
Query: InsertObjectQuery(com.model.Orders[ id=null ])

你可以看到,出于某种原因;CALL";用于INSERT INTO查询
我调试到我的代码中,当我评估这个部分时

em.createNativeQuery("SELECT * FROM orders WHERE surprice_id = '" + surpriceId + "'", Orders.class)

我可以看到生成的databseQuery是

ReadAllQuery(referenceClass=Orders sql="SELECT * FROM orders WHERE surprice_id = 'SCR386148'")

但当我在末尾添加.getResultList()时,我得到了前面提到的错误
在调试过程中,我检查了数据库中不存在的其他ID,但我只得到了一个0大小的结果列表,所以我真的很困惑是什么导致了这种行为。。。

关于我应该把注意力转向哪里,有什么想法吗?

在执行查询之前,EclipseLink会检查查询结果是否会受到属于会话但尚未保存在数据库中的实体的影响。如果是这种情况,它会在运行查询之前刷新会话。

似乎在运行本机查询之前,您已经持久化了一个订单。EclipseLink知道查询将影响实体Order,因此它将确保在运行本机查询之前执行上一个持久化操作。否则,以前尚未持久化的订单将永远不会出现在查询中。也许在这种情况下,这并不重要,但在其他情况下,情况可能并非如此。

在使用.getResultList()之前,不执行任何查询,因此不需要刷新。

我怀疑您创建订单的方式有问题,导致违反约束

最新更新