【发布时间】:2011-09-24 17:46:45
【问题描述】:
当我尝试使用多线程持久化对象时遇到问题。
详情:
假设我有一个对象PaymentOrder,其中包含PaymentGroup(一对多关系)列表,PaymentGroup 包含CreditTransfer(又是一对多关系)列表。
由于CreditTransfer 的数量很大(以十万为单位),我根据PaymentGroup 对其进行了分组(基于一些业务逻辑)
并创建 WORKER 线程(每个 PaymentGroup 一个线程)以形成 PaymentOrder 对象并提交到数据库中。
问题是,每个工作线程都在创建一个PaymentOrder(其中包含一组唯一的PaymentGroups)。
所有实体的主键都是自动生成的。
所以一共有三个表,1. PAYMENT_ORDER_MASTER, 2. PAYMENT_GROUPS, 3. CREDIT_TRANSFERS,都是一对多关系映射的。
因为当第二个线程尝试将其组持久化到数据库中时,框架尝试持久化相同的PaymentOrder,前一个线程已提交,事务由于一些其他唯一字段约束而失败(@987654331 的校验和@)。
理想情况下它必须是 1..n..m (PaymentOrder ->PaymentGroup-->CreditTransfer`)
我需要实现的是,如果数据库中没有PaymentOrder 的条目,则创建一个条目,如果存在,则不要在PAYMENT_ORDER_MASTER 中输入,而只能在PAYMENT_GROUPS 和CREDIT_TRANSFERS 中输入。
我怎样才能克服这个问题,维护 split-master-payment-order-using-groups 逻辑和多个线程?
【问题讨论】:
标签: java multithreading hibernate orm jpa-2.0