Java 获得;“事务未成功启动”;

Java 获得;“事务未成功启动”;,java,hibernate,tapestry,Java,Hibernate,Tapestry,每次我插入/更新DB时都会收到此警告。但我的数据仍然保存着。不过,我还是想从日志文件中删除它 下面是我的日志文件: [WARN] TapestryIOCModule.PerthreadManager Error invoking listener org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl@41c045: Transaction not successfully started org.hibernate

每次我插入/更新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)
这是我的服务impl:

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);
}
专用HibernateSessionManager会话管理器;
公共HibernateSessionManager getSessionManager(){
返回会话管理器;
}
public void setSessionManager(HibernateSessionManager会话管理器){
this.sessionManager=sessionManager;
}
@注入
私人会话工厂会话工厂;
public void setSessionFactory(SessionFactory SessionFactory){
this.sessionFactory=sessionFactory;
}
公共会话getHibernateSession(){
如果(getSessionManager()!=null)
返回getSessionManager().getSession();
其他的
返回sessionFactory.getCurrentSession();
}
@抑制警告(“原始类型”)
公共标准createCriteria(类类别、标准…标准){
会话=getHibernateSession();
如果(!session.getTransaction().isActive())
session.beginTransaction();
Criteria crit=session.createCriteria(clazz);
对于(标准c:标准)
标准增补(c);
返回暴击;
}
@SuppressWarnings({“unchecked”,“rawtypes”})
公共T获取(ID、布尔锁、类clazz){
if(id==null)
返回null;
T实体;
会话=getHibernateSession();
如果(!session.getTransaction().isActive())
session.beginTransaction();
如果(锁定)
实体=(T)session.load(clazz,id);
其他的
entity=(T)session.get(clazz,id);
返回实体;
}
@抑制警告(“原始类型”)
公共列表findAll(类别分类){
返回findByCriteria(clazz);
}
@SuppressWarnings({“rawtypes”,“unchecked”})
公共列表findByCriteria(类类别、标准…标准){
会话=getHibernateSession();
Criteria crit=session.createCriteria(clazz);
对于(标准c:标准)
标准增补(c);
返回crit.list();
}
公共T创建(T实体){
事务tx=getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(实体);
tx.commit();
返回实体;
}
公共T更新(T实体){
事务tx=getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(实体);
tx.commit();
返回实体;
}
公共作废删除(T实体){
事务tx=getHibernateSession().beginTransaction();
getHibernateSession().delete(实体);
tx.commit();
}
公共无效createOrUpdate(T实体){
事务tx=getHibernateSession().beginTransaction();
getHibernateSession().saveOrUpdate(实体);
tx.commit();
}
公共T合并(T实体){
事务tx=getHibernateSession().beginTransaction();
getHibernateSession().merge(实体);
tx.commit();
返回实体;
}
//使用者
@凌驾
公共用户createOrUpdateUser(用户用户){
if(user.getId()==null | | user.getId()==0){
字符串encodePass=PasswordUtils.EncodePassword(user.getName(),user.getPassword());
user.setPassword(encodePass);
}
if(user.getId()==null)
返回创建(用户);
其他的
返回更新(用户);
}
@凌驾
公共用户getUserByID(整数id){
返回get(id,false,User.class);
}

我不知道这是否会影响我的应用程序性能。来自堆栈溢出的另一个答案与同样的问题并没有帮助解决我的问题。我想知道我的情况是否不同。

您是否尝试过使用@CommitAfter注释,而不是在代码中显式启动和提交事务?

我已经按照您的建议添加@CommitAfter。异常已消失,但数据未保存。