【问题标题】:Why @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) does not commit?为什么 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 不提交?
【发布时间】:2016-02-12 11:49:08
【问题描述】:

我有包含此代码的 OwnerService 类:

public RegisterOwnerResult registerOwner(RegisterOwnerRequest request) {
    try {
        Owner owner = doRegisterOwner(request);
        return RegisterOwnerResult.createSuccessful(owner.getId());
    } catch (Exception ex) {
        return RegisterOwnerResult.createUnsuccessful();
    }
}

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private Owner doRegisterOwner(RegisterOwnerRequest request) {
    Account account = new Account(request.getEmail(), request.getPassword());
    Owner owner = new Owner(account, request.getFirstName(), request.getLastName());

    ownerFacade.create(owner);

    return owner;
}

以及应该启动数据库的 Startup Singleton bean:

@PostConstruct
public void initiate() {
    RegisterOwnerRequest registerOwnerRequest = new RegisterOwnerRequest(
            "john.barton@example.com",
            "pass123",
            "John",
            "Barton"
    );
    RegisterOwnerResult registerOwnerResult = ownerService.registerOwner(registerOwnerRequest);
    if (registerOwnerResult.wasSuccessful()) {
        System.out.println("Owner ID: " + registerOwnerResult.getOwnerId());
    }
}

但不幸的是 registerOwnerResult.getOwnerId() 返回 null。我想原因是doRegisterOwner 方法没有提交对数据库的更改。我不知道它是功能还是错误,但我还是想让它工作。

【问题讨论】:

    标签: java jpa jakarta-ee transactions java-ee-7


    【解决方案1】:

    这是设计使然。只有外部调用(即通过容器的代理/拦截系统来自其他 bean 的调用)尊重任何属性。

    如果您希望在新事务中调用doRegisterOwner,请将该代码移至另一个会话 bean。或者干脆将注解移到OwnerService中的公共registerOwner方法中。

    【讨论】:

    • 您认为创建另一个会话 bean 还是手动提交事务更好?
    • 见我编辑,在你的例子中应该足够了。一般来说,容器管理的事务在大多数情况下都很好,几乎不需要用户管理的事务。
    • 但是当我将注释移动到公共registerOwner 方法ownerId 字段仍然为空。
    猜你喜欢
    • 2012-07-21
    • 2013-03-17
    • 2015-09-07
    • 1970-01-01
    • 2013-11-24
    • 2016-11-18
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多