![](/img/trans.png)
[英]PSQL: current transaction is aborted, commands ignored until end of transaction block
[英]Hibernate error - current transaction is aborted, commands ignored until end of transaction block
我的代碼有問題:
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);
}
當試圖打電話時, MyPojo p = get(1, MyPojo.cass);
它拋出:
[ERROR] Caused by: org.hibernate.exception.GenericJDBCException: ERROR: current transaction is aborted, commands ignored until end of transaction block
[ERROR] at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
[ERROR] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
[ERROR] at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
[ERROR] at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
[ERROR] at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
[ERROR] at $Proxy175.executeQuery(Unknown Source)
[ERROR] at org.hibernate.loader.Loader.getResultSet(Loader.java:2031)
[ERROR] at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832)
[ERROR] at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
[ERROR] at org.hibernate.loader.Loader.doQuery(Loader.java:899)
[ERROR] at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
[ERROR] at org.hibernate.loader.Loader.doList(Loader.java:2516)
[ERROR] at org.hibernate.loader.Loader.doList(Loader.java:2502)
[ERROR] at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
[ERROR] at org.hibernate.loader.Loader.list(Loader.java:2327)
[ERROR] at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)
[ERROR] at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
[ERROR] at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
[ERROR] at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1247)
[ERROR] at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
[ERROR] at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:283)
[ERROR] ... 48 more
簡而言之,就是您的數據庫上的操作引發了一個早期異常,並且您沒有回滾與該操作相關的事務。 跟隨這個例子的時間越長。 假設您有一個將對象保存到DB中的方法:
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塊中,您可以看到我們沒有回滾事務。 從這時起,每次訪問DB都會導致“錯誤:當前事務被中止,......”錯誤。
現在您需要做的是回滾每個失敗的事務,以便您的應用程序和數據庫保持同步:
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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.