java - 为什么 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 不提交?

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

我有包含以下代码的 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 方法没有提交对数据库的更改。我不知道它是功能还是错误,但我还是想让它工作。

最佳答案

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

如果您希望在新事务中调用 doRegisterOwner,请将该代码移动到另一个 session bean。或者简单地将注释移动到 OwnerService 中的公共(public) registerOwner 方法。

关于java - 为什么 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 不提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361876/

相关文章:

java - 为什么 Hikari 构建了一个错误的数据库 URL?

java - 规范化 PCM 数据

java - 返回类的副本

java - 我哪里搞砸了?为什么我的方法返回无穷大?

Hibernate 自动将 1=2 附加到生成的查询

java - GlassFish:使用 --force 进行部署

jakarta-ee - Enterprise Java Bean (EJB) 新手

java - 如何设置 AutocompleteTextView 一次只执行一个过滤器搜索并在开始过滤之前设置延迟?

java - Hibernate:复杂对象的初始化

java - 我有一些模型,我不想插入手动或自动@Id,我只想从插入中忽略它? java