我将 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?