[英]Getting “Transaction not successfully started”
每當我插入/更新到DB時,我都會得到此警告。 但是,我的數據仍然保存。 盡管如此,我還是想從我的日志文件中刪除它。
以下是我的日志文件:
[WARN] TapestryIOCModule.PerthreadManager Error invoking listener org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl@41c045: Transaction not successfully started org.hibernate.TransactionException: Transaction not successfully started at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:179) at org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.threadDidCleanup(HibernateSessionManagerImpl.java:65)
at org.apache.tapestry5.ioc.internal.services.PerthreadManagerImpl.cleanup(PerthreadManagerImpl.java:128)
at org.apache.tapestry5.ioc.internal.RegistryImpl.cleanupThread(RegistryImpl.java:445)
at org.apache.tapestry5.ioc.internal.RegistryWrapper.cleanupThread(RegistryWrapper.java:38)
at org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:178)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
這是我的服務暗示:
private HibernateSessionManager sessionManager;
public HibernateSessionManager getSessionManager() {
return sessionManager;
}
public void setSessionManager(HibernateSessionManager sessionManager) {
this.sessionManager = sessionManager;
}
@Inject
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Session getHibernateSession() {
if (getSessionManager() != null)
return getSessionManager().getSession();
else
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("rawtypes")
public Criteria createCriteria(Class clazz, Criterion... criterion) {
Session session = getHibernateSession();
if (!session.getTransaction().isActive())
session.beginTransaction();
Criteria crit = session.createCriteria(clazz);
for (Criterion c : criterion)
crit.add(c);
return crit;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T, ID extends Serializable> T get(ID id, boolean lock, Class clazz) {
if (id == null)
return null;
T entity;
Session session = getHibernateSession();
if (!session.getTransaction().isActive())
session.beginTransaction();
if (lock)
entity = (T) session.load(clazz, id);
else
entity = (T) session.get(clazz, id);
return entity;
}
@SuppressWarnings("rawtypes")
public <T extends Serializable> List<T> findAll(Class clazz) {
return findByCriteria(clazz);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public <T extends Serializable> List<T> findByCriteria(Class clazz, Criterion... criterion) {
Session session = getHibernateSession();
Criteria crit = session.createCriteria(clazz);
for (Criterion c : criterion)
crit.add(c);
return crit.list();
}
public <T extends Serializable> T create(T entity) {
Transaction tx = getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(entity);
tx.commit();
return entity;
}
public <T extends Serializable> T update(T entity) {
Transaction tx = getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(entity);
tx.commit();
return entity;
}
public <T extends Serializable> void delete(T entity) {
Transaction tx = getHibernateSession().beginTransaction();
getHibernateSession().delete(entity);
tx.commit();
}
public <T extends Serializable> void createOrUpdate(T entity) {
Transaction tx = getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(entity);
tx.commit();
}
public <T extends Serializable> T merge(T entity) {
Transaction tx = getHibernateSession().beginTransaction();
getHibernateSession().merge(entity);
tx.commit();
return entity;
}
// USER
@Override
public User createOrUpdateUser(User user) {
if (user.getId() == null || user.getId() == 0) {
String encodePass = PasswordUtils.EncodePassword(user.getName(), user.getPassword());
user.setPassword(encodePass);
}
if (user.getId() == null)
return create(user);
else
return update(user);
}
@Override
public User getUserByID(Integer id) {
return get(id, false, User.class);
}
我不知道這是否會影響我的應用程序性能。 來自Stack Overflow的另一個問題相同的答案並沒有幫助解決我的問題。 我想知道我的情況是否不同。
您是否嘗試過使用@CommitAfter注釋,而不是在代碼中顯式啟動和提交轉換?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.