Java 休眠错误-当前事务中止,在事务块结束之前忽略命令

Java 休眠错误-当前事务中止,在事务块结束之前忽略命令,java,hibernate,Java,Hibernate,我对该代码有一些问题: private EntityManager entityManager; public EntityManager getEntityManager() { if (entityManager == null) { entityManager = Persistence.createEntityManagerFactory("pu-mypu").createEntityManager(); } return entityManag

我对该代码有一些问题:

private EntityManager entityManager;

public EntityManager getEntityManager() {
    if (entityManager == null) {
        entityManager = Persistence.createEntityManagerFactory("pu-mypu").createEntityManager();
    }
    return entityManager;
}


public <T> T get(Long id, Class<T> type) {
    return getEntityManager().find(type, id);
}

简单的回答是,您的数据库上有一个操作引发的早期异常,并且您没有回滚与该操作相关的事务。 较长的一个遵循此示例。假设您有一种将对象保存到数据库中的方法:

public Serializable saveObject(E object) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction trans = session.beginTransaction();
    try {           
        Serializable id = session.save(object);
        session.flush();
        trans.commit();
        return id;
    } catch (Exception e) {
        e.printStackTrace();            
        return null;
    }
}
现在,假设由于某些约束冲突(例如,唯一的主键重复),上述代码引发运行时异常。在catch块中,您可以看到我们没有回滚事务。从这一刻起,每次访问数据库都会导致“错误:当前事务被中止,…”错误。
现在,您要做的是回滚每个失败的事务,以便应用程序和数据库保持同步:

public Serializable saveObject(E object) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction trans = session.beginTransaction();
    try {           
        Serializable id = session.save(object);
        session.flush();
        trans.commit();
        return id;
    } catch (Exception e) {
        e.printStackTrace();
        session.flush();
        trans.rollback();
        return null;
    }
}

检查您生成的SQL。。。可能由于某种原因出现了语法错误。它是否完整?
public Serializable saveObject(E object) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    Transaction trans = session.beginTransaction();
    try {           
        Serializable id = session.save(object);
        session.flush();
        trans.commit();
        return id;
    } catch (Exception e) {
        e.printStackTrace();
        session.flush();
        trans.rollback();
        return null;
    }
}