HibernateException:无法获取当前线程的事务同步会话

J.O*_*sen 9 java spring hibernate

我收到错误:

Exception in thread "main" org.hibernate.HibernateException: 
Could not obtain transaction-synchronized Session for current thread
Run Code Online (Sandbox Code Playgroud)

主要

ppService.deleteProductPart(cPartId, productId);
Run Code Online (Sandbox Code Playgroud)

@Service( "productPartService")

@Override
public void deleteProductPart(int cPartId, int productId) {
    productPartDao.deleteProductPart(cPartId, productId);
}
Run Code Online (Sandbox Code Playgroud)

@Repository( "productPartDAO")

@Override
    public void deleteProductPart(ProductPart productPart) {
        sessionFactory.getCurrentSession().delete(productPart);
    }


@Override
    public void deleteProductPart(int cPartId, int productId) {
        ProductPart productPart  = (ProductPart) sessionFactory.getCurrentSession()
                .createCriteria("ProductPart")
                .add(Restrictions.eq("part", cPartId))
                .add(Restrictions.eq("product", productId)).uniqueResult();
        deleteProductPart(productPart);
    }
Run Code Online (Sandbox Code Playgroud)

怎么解决?

更新:

如果我修改这样的方法:

@Override
@Transactional
public void deleteProductPart(int cPartId, int productId) {          
    System.out.println(sessionFactory.getCurrentSession());
}
Run Code Online (Sandbox Code Playgroud)

它返回:

SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] collectionQueuedOps=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])
Run Code Online (Sandbox Code Playgroud)

但如果我删除@Transactional它最终会有异常:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
Run Code Online (Sandbox Code Playgroud)

我通过添加来实现它@Transactional,但现在我得到了org.hibernate.MappingException: Unknown entity: ProductPart虽然我被锁定.uniqueResult()Criteria.怎么解决?

Cha*_*nya 7

该错误org.hibernate.MappingException: Unknown entity: ProductPart表示没有名称的实体ProductPart.解决此问题的一种方法是将Class对象传递给createCriteria方法:

createCriteria(ProductPart.class)
Run Code Online (Sandbox Code Playgroud)

从API开始,使用String和Class的区别如下:

Session.createCriteria(字符串)

Create a new Criteria instance, for the given entity name. 
Run Code Online (Sandbox Code Playgroud)

Session.createCriteria(类)

使用给定的别名为给定的实体类或实体类的超类创建新的Criteria实例.

如果你传递一个String,那么hibernate会查找一个名称被声明为的实体ProductPart.


Aym*_*bsi 6

使用Hibernate 4.x和Spring 4.x,只需在@Repository之后添加@Transactional它将解决此同步异常.