HibernateException: не удалось получить сеанс синхронизации транзакций для текущего потока

я получаю ошибку:

Exception in thread "main" org.hibernate.HibernateException: 
Could not obtain transaction-synchronized Session for current thread

main

ppService.deleteProductPart(cPartId, productId);

@Service ("productPartService")

@Override
public void deleteProductPart(int cPartId, int productId) {
    productPartDao.deleteProductPart(cPartId, productId);
}

@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);
    }

как это исправить?

обновление:

если я изменяю такой метод:

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

возвращает:

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

но если я удалить @Transactional он заканчивается исключение:

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

я получаю его работу, добавляя @Transactional, но теперь я получаю org.hibernate.MappingException: Unknown entity: ProductPart хотя я прикован .uniqueResult() to Criteria. Как это исправить?

4 ответов


ошибка org.hibernate.MappingException: Unknown entity: ProductPart указывает, что нет сущности с именем ProductPart. Один из способов исправить эту проблему-передать Class объект createCriteria метод as:

createCriteria(ProductPart.class)

из API разница в использовании строки и класса заключается в следующем:

сессии.createCriteria (String)

Create a new Criteria instance, for the given entity name. 

сессии.createCriteria (Class)

создайте новый экземпляр критериев для данного класса сущностей или надкласс класса сущности с заданным псевдонимом.

если вы передаете строку, то hibernate ищет объект, имя которого объявлено как ProductPart.


С Hibernate 4.x и Весна 4.x, просто добавить @Transactional после @Repository это решит это исключение synchronizaion.


необходимо включить поддержку транзакций (<tx:annotation-driven> или @EnableTransactionManagement) и объявить transactionManager, и он должен работать через SessionFactory.

вы должны добавить @Transactional в своем @Repository

С @Transactional в своем @Repository Spring может применять транзакционную поддержку в вашем репозитории.

ваш студенческий класс не имеет @javax.persistence.* аннотации как @Entity, Я предполагаю, что конфигурация отображения для этого класса была определена через XML.

Ref


У меня была такая же ошибка, как " org.зимовать.HibernateException: не удалось получить сеанс синхронизации транзакций для текущего потока"

Я просто использовать @Transactional (только чтение = false) в своем Дао реализация разрешила мою проблему