Java 在回滚的情况下,如何在JPA中重置自动生成的密钥?

Java 在回滚的情况下,如何在JPA中重置自动生成的密钥?,java,jpa,Java,Jpa,我有一种情况,在回滚的情况下,我需要将自动递增键重置为以前的值。我的控制器类中有一系列create语句。如果发生任何异常,我可以回滚所有create语句。但生成的自动增量不会为特定实体重置。好心帮忙 以下是我的控制课程。 @EJB private jpa.session.ClassMasterFacade ejbFacadeCM; @EJB private jpa.session.StudentMasterFacade ejbFacadeSM; @EJB private jpa.session.

我有一种情况,在回滚的情况下,我需要将自动递增键重置为以前的值。我的控制器类中有一系列create语句。如果发生任何异常,我可以回滚所有create语句。但生成的自动增量不会为特定实体重置。好心帮忙

以下是我的控制课程。

@EJB
private jpa.session.ClassMasterFacade ejbFacadeCM;
@EJB
private jpa.session.StudentMasterFacade ejbFacadeSM;
@EJB
private jpa.session.ParentsMasterFacade ejbFacadePM;
@EJB
private jpa.session.AddressMasterFacade ejbFacadeAM;
@Resource
    UserTransaction tran;
public String confirmData() {
    try {
    tran.begin();
        ejbFacadeSM;.create(selectedSM);
        ejbFacadeCM;.create(selectedCM)
        ejbFacadeAM;.create(selectedAM);
        ejbFacadePM;.create(selectedPM);
    } catch (Exception e) {
        tran.rollback();
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle ("/resources/Bundle").getString("PersistenceErrorOccured"));
        return null;
    }
 }
立面类示例

@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);
    }

}

使用内置的JPA机制,您可能无法做到这一点。特定表的AI要点是为同时完成的所有事务中的所有实体提供唯一性。例如,如果您同时运行两个类似的事务,其中一个将成功,从其中一个事务的角度来看,AI将具有新值,而回滚的事务则具有旧值。这将导致任何后续事务中的唯一性冲突,因为AI计数器将被设置为一些已使用的值。这不是在JPA方面做的,而是在DB方面@antoniosss完全同意你所说的。你能告诉我前面的路吗?我的意思是我可以不再担心这一点,但我想要一个连续的人工智能。简单地说,你不能保证人工智能列(特别是那些将是唯一的列)将以无间隔的顺序持续存在,仅仅因为我写的是回滚。您必须在序列化事务中手动设置这些值,但IDK是值得的。您应该添加您正在使用的DBMS(Postgres、Oracle等)。但一般来说,自动生成的值不是这样工作的。他们唯一的目的就是与众不同。您永远不能假设它们是无间隙的(并且您也不能真的假设它们也在增加,有些实现允许以后的事务获得比以前的事务更低的值)。我所知道的任何数据库管理系统实际上都不能回滚生成的值,这就是为什么它们能够快速、可扩展并且安全地用于并发事务的原因之一。我了解自动生成密钥的使用。我现在明白了,我所寻找的是不可能的。生成自己的序列也不可行。也许我会停止担心,把它留在那里。谢谢大家的想法!!!
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);
    }
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "class_group_id")
private Integer classGroupId;