JPA重复实体创建问题

时间:2014-02-26 02:57:22

标签: jpa ejb-3.0

我实现了一个ejb3无状态会话bean,用于将一组收件人导入数据库。我在公共方法中使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)提交了每个收件人记录

 @Stateless
 @Local(ImportRecipientManagerLocal.class)
 @SecurityDomain("recipient")

 public class ImportRecipientManagerSLB implements ImportRecipientManagerLocal {

 @EJB
 private ImportRecipientManagerLocal anotherRecipientManager;

 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
 @TransactionTimeout(30 * 60)
 @Override
 public RecipientImportStatus saveRecipient(Recipient recipient) throws 
 ImportRecipientFailedException  {
       // saves the reicpient
  }


 public  RecipientsImportStatus createRecipients(List<Recipient> recipientList) {

 // while recipient exist in list
    anotherRecipientManager.saveRecipient(recipient);  
 // end while

}

问题是当客户同时提交了2个相同的文件(内容相同)时,它创建了重复的收件人。我认为这是因为两个会话bean处理器是并行执行的。但困扰我的是,自saveRecipient结束后,事务被提交,数据应该对其他事务可见。不是吗?

我无法理解它是如何发生的,感谢有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

正如你所说的,如果事务同时并行运行,它创建了重复的收件人,但是如果我们使用FlushMode.COMMIT,则意味着它在提交之前总是与数据库同步,这就是第二个进程记录插入失败并出现约束违规的原因。所以总是建议在提交之前进行刷新。