jakarta-ee - 什么是具有容器管理事务优势的 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?
解决方案
不同之处在于谁管理事务分界
如果你自己管理它(BEAN)你控制好的和错误的情况(你必须做一个提交/回滚)
如果你让它做容器,任何未处理的异常都会隐式地导致回滚,并且为你确保提交。所以你只需要实现逻辑,其余的由 JTA 完成
因此,如果您不需要对事务进行任何特殊处理,最简单的方法是将事务处理留给容器
推荐阅读
- windows - 如何从第一行输出中仅获取 postgres.exe 的 PID
- javascript - 为什么 for 循环函数返回 else-code 而不是输入 if-true-code?
- html - 如何使用 Blazor 组件定位特定的 div?
- android - 使用改造 android 的搜索视图
- ibm-midrange - 在 IBM i 的 iASP 上运行程序时通过 IFS 引用库
- javascript - 有人开始流式传输时的自动角色
- c++ - 了解复制构造函数的工作
- javascript - Angular:使用 *ngIf 隐藏组件不起作用
- excel - 从 S3 下载时 Excel 文件损坏
- python - 带有芹菜的 django 中的 TemplateDoesNotExist 错误