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