首页 > 解决方案 > 什么是具有容器管理事务优势的 JTA

问题描述

我将 JavaEE 8 与 OpenLiberty Application server 一起使用。
在我的项目中,我尝试在 CRUD 层中使用 JTA over container managed transaction (BMT)。
这是我的示例代码:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class SampleCRUD {

    @Inject
    private Logger logger;

    @PersistenceContext
    private EntityManager em;

    public void insertFood(Food food) {
        em.persist(food);
    }

    public void updateFood(Food food) {
        em.merge(food);
    }

    public Food selectFood(long id) {
        return em.find(Food.class, id);
    }

    public void deleteFood(long id) {
        em.remove(select(id));
    }
}      

和食品实体:

@Table
@Entity
@SequenceGenerator(name = "default_seq", sequenceName = "food_seq", allocationSize = 1)
public class Food extends BaseEntity {

    @Column(unique = true)
    private String name;
    

我想了解:
在 sql 插入/删除/更新操作之前,是否有任何建议选择数据库?
我问这个问题是因为在 CMT 模式下无法捕获应用程序上的约束或 SQL 异常。

在我的示例代码中:

什么是具有容器管理事务 (CMT) 优势的 JTA?

标签: jakarta-eejtabean-managed-transactions

解决方案


不同之处在于谁管理事务分界

如果你自己管理它(BEAN)你控制好的和错误的情况(你必须做一个提交/回滚)

如果你让它做容器,任何未处理的异常都会隐式地导致回滚,并且为你确保提交。所以你只需要实现逻辑,其余的由 JTA 完成

因此,如果您不需要对事务进行任何特殊处理,最简单的方法是将事务处理留给容器


推荐阅读