我遇到需要通过JMS
(分组消息)接收大文件的部分并将其存储在数据库中的情况。
问题是,群组中的每封邮件都是TABLE A
中的一行,@ManytoOne
的{{1}}版权问题。这意味着对于一个组,表B中只有一个条目,但表A中有许多条目。
我当前的逻辑是这样的,在插入TABLE B
之前,我正在检查任何条目(@NamedQuery,因为那时table A
不会知道主键),以及如果找不到,则创建一个新的(在此处创建MDB
的主键)。
由于Table B
有多个实例接收同一组中的消息,MDB
中的条目因相同的消息组而重复,因为MDB中首先创建表B的条目的事务是还没有下载。
更清楚:
第1步:接收消息。
步骤2:创建表A所需的权利。检查表B中是否有任何具有相同组ID的条目(table B
),如果找到,则设置关系并保持,如果不存在,则创建新实体对于表B(READ
)(由服务生成主键)设置关系并保持不变。
问题是,MDB的多个实例为表B创建条目,因为它无法在WRITE
期间找到条目(由第一个MDB创建),因此同一组的READ
个新条目ID。
有什么办法可以解决这个问题吗? 1.我正在使用eclipselink和Oracle,使用@PersistenceContext注释注入Container托管事务和实体管理器。
由于
答案 0 :(得分:1)
不完全确定你在做什么?您是否试图阻止两笔交易创建新的A或仅创建一个新的B?
您可以在B表中的A外键上添加唯一约束。这将确保第二次尝试为A插入B将失败。
另一个解决方案是对事务A使用悲观锁,这将确保事务不会发生冲突。
您也可以通过强制A的版本递增来使用乐观锁,这将导致第二次尝试失败。实际上由于A有一个ManyToOne到B,它的版本应该递增,所以你应该已经出现锁定错误。