使用jpacontainerfactory创建的实体管理器选择查询创建插入查询

yhuiod9q  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(278)

我有下表的订单(为了便于阅读,我删除了大部分列)

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
);

我有一个sync方法,在这个方法中,我得到一个外部订单列表,并遍历它们,检查“surprice\u 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,则我将其添加到系统中,否则我将更新详细信息。
出于某种原因,在特定的u 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)

我可以看到生成的数据序列是

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

但是当我加上 .getResultList() 最后,我得到了前面提到的错误。
在调试过程中,我检查了数据库中不存在的其他ID,只得到一个0大小的结果列表,所以我真的很困惑是什么导致了这种行为。。。
关于我应该把注意力转向哪里有什么想法吗?

bkhjykvo

bkhjykvo1#

在执行查询之前,eclipselink会检查查询结果是否受属于会话但尚未保存在数据库中的实体的影响。如果是这样,它会在运行查询之前刷新会话。
似乎在运行本机查询之前,您已经保存了一个顺序。eclipselink知道查询将影响实体 Order ,因此它将确保在运行本机查询之前执行上一个persist操作。否则,以前尚未持久化的顺序将永远不会出现在查询中。也许在这种情况下这不重要,但在其他情况下可能不是这样。
使用前 .getResultList() ,不执行任何查询,因此不需要刷新。
我怀疑您创建导致违反约束的顺序的方式有问题

相关问题