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.
создайте новый экземпляр критериев для данного класса сущностей или надкласс класса сущности с заданным псевдонимом.
если вы передаете строку, то 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.
У меня была такая же ошибка, как " org.зимовать.HibernateException: не удалось получить сеанс синхронизации транзакций для текущего потока"
Я просто использовать @Transactional (только чтение = false) в своем Дао реализация разрешила мою проблему