如何回滚JPA中的一系列persistent语句?

rah*_*hul 5 java jpa

我有一种情况,我需要回滚一系列的persist方法。我的控制器类中有一个方法,从那里我可以调用persist方法。

控制器类:

@EJB
private jpa.session.ClassMasterFacade ejbFacadeCM;
@EJB
private jpa.session.StudentMasterFacade ejbFacadeSM;
@EJB
private jpa.session.ParentsMasterFacade ejbFacadePM;
@EJB
private jpa.session.AddressMasterFacade ejbFacadeAM;

public String confirmData() {
    try {
        ejbFacadeSM;.create(selectedSM);
        ejbFacadeCM;.create(selectedCM)
        ejbFacadeAM;.create(selectedAM);
        ejbFacadePM;.create(selectedPM);
    } catch (Exception e) {
        //rollback all
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle ("/resources/Bundle").getString("PersistenceErrorOccured"));
        return null;
    }
 }
Run Code Online (Sandbox Code Playgroud)

外观类示例:

@Stateless
public class ClassMasterFacade extends AbstractFacade<ClassMaster> {

    @PersistenceContext(unitName = "sdjv_smsPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ClassMasterFacade() {
        super(ClassMaster.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

所有其他外观类与上述类相似。抽象类是:

public abstract class AbstractFacade<T> {
    private Class<T> entityClass;

    public AbstractFacade(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    protected abstract EntityManager getEntityManager();

    public void create(T entity) {
        getEntityManager().persist(entity);
    }

    public void edit(T entity) {
        getEntityManager().merge(entity);
    }

    public void remove(T entity) {
        getEntityManager().remove(getEntityManager().merge(entity));
    }

    public T find(Object id) {
        return getEntityManager().find(entityClass, id);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果发现任何异常,我想回滚所有create方法。

我搜索并找到了一些答案:

我是JPA的新手,并且刚刚开始探索它。我想念一些概念吗?

直到有一个问题,不知道它是否相关。在所有实体类中,我都有一个自动生成的密钥,该密钥已更新。问题是,如果异常发生在第二个create语句中,则将生成第一个create语句的自动生成的键,但仍未在mysql中进行更新。

实体类别:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "class_group_id")
private Integer classGroupId;
Run Code Online (Sandbox Code Playgroud)

And*_*ert 5

用一个 javax.transaction.UserTransaction在任何标准Java EE环境中都可用的。

用法非常简单,请注入并使用以下方法:

  • begin() 开始交易
  • commit() 如果所有操作都成功并且您想要提交结果
  • rollback()如果发生错误,并且您想回滚到begin()被调用的时间点

请参阅:有关UserTransaction的Oracle文档

@Resource
UserTransaction tran;

...

public void confirmData (){

    tran.begin();
    try {
        ejbFacadeSM.create(selectedSM);
        ejbFacadeCM.create(selectedCM)
        ejbFacadeAM.create(selectedAM);
        ejbFacadePM.create(selectedPM);

        // Create's succeeded, commit transaction.
        tran.commit();
    } catch (Exception e) {
        // Error occurred, rollback transaction
        tran.rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)