JPA:现有实体未更新

时间:2018-12-17 16:30:08

标签: java hibernate jpa entitymanager stateless

我遇到的问题是,在某些极少数情况下(<1%),现有实体无法正确更新。在所有其他情况下,它都按预期运行。

堆栈:JPA和Hibernate,Wildfly10(群集),Ubuntu,PostgreSQL(主/从设置)

发生了什么事?

  1. 用户正在其浏览器中等待将ContractEntity设置为PAID。浏览器每3秒执行一次请求,以拉出ContractEntity的状态
  2. 我们的付款提供商正在我们的服务器上调用一个Webhook,该Webhook调用了功能setContractToPaidAndNotifyUsers()。这应将ContractEntity的状态更改为PAID,但保持在状态STARTED。没有记录错误,此后发生的其他函数调用也可以正常工作(发送电子邮件)。

因此,我认为在提交数据库事务时会发生错误。

这是webhook调用的功能:

@Stateless
public class ContractBoundary {

    @Inject
    private ContractControl contractControl;


    private void setContractToPaidAndNotifyUsers(PaymentEntity paymentEntity, ContractEntity contractEntity, final String paidResourceId) {

        // This is not working (no error, but the contract remains on status STARTED
        contractEntity.setStatus(ContractStatusEnum.PAID);
        contractEntity.setPaidResourceId(paidResourceId);
        ContractEntity updatedContractEntity = contractControl.update(contractEntity);

        // These are working
        mailControl.sendMoneyArrivedMailToPayee(
                contractBoundary.getContractLink(updatedContractEntity.getContractCode()),
                updatedContractEntity.getTitle(), updatedContractEntity.getPayer(), updatedContractEntity.getPayee(),
                eventMoneyArrivedForPayee);
        mailControl.sendMoneyArrivedMailToPayer(
                contractBoundary.getContractLink(updatedContractEntity.getContractCode()), contractEntity.getTitle(),
                updatedContractEntity.getPayer(), updatedContractEntity.getPayee(), eventMoneyArrivedForPayer);


        }
}

这是contractControl中的更新功能

public class ContractControl extends BasicCrudControl {

    // ... more CRUD functions

    public ContractEntity update(final ContractEntity contract) {
        ContractEntity update = super.update(contract);
        return update;
    }
}

这是BasicCRUDControl的更新功能:

protected <T> T update(final T entityToUpdate) {
    T t = this.em.merge(entityToUpdate);
    return t;
}

我必须在em.flush();函数中运行em.refresh();update吗? 因为它仅在某些情况下发生,所以我认为在调用Webhook的同时执行来自用户浏览器的请求时可能会出现问题,这可能会导致一些麻烦。

我还认识到ContractControl没有@Stateless注释,这会导致问题,因为ContractBoundary被标记为无状态并且正在注入ContractControl吗?

感谢您的帮助!

0 个答案:

没有答案